(mc, node, meta)
| 15124 | |
| 15125 | // can return null for a deleted entity if includeDeleted == false |
| 15126 | function mergeEntity(mc, node, meta) { |
| 15127 | node._$meta = meta; |
| 15128 | var em = mc.entityManager; |
| 15129 | |
| 15130 | var entityType = meta.entityType; |
| 15131 | if (typeof (entityType) === 'string') { |
| 15132 | entityType = mc.metadataStore._getEntityType(entityType, false); |
| 15133 | } |
| 15134 | node.entityType = entityType; |
| 15135 | |
| 15136 | var mergeStrategy = mc.mergeOptions.mergeStrategy; |
| 15137 | var isSaving = mc.query == null; |
| 15138 | |
| 15139 | var entityKey = entityType.getEntityKeyFromRawEntity(node, mc.rawValueFn); |
| 15140 | var targetEntity = em.findEntityByKey(entityKey); |
| 15141 | if (targetEntity) { |
| 15142 | if (isSaving && targetEntity.entityAspect.entityState.isDeleted()) { |
| 15143 | em.detachEntity(targetEntity); |
| 15144 | return targetEntity; |
| 15145 | } |
| 15146 | var targetEntityState = targetEntity.entityAspect.entityState; |
| 15147 | if (mergeStrategy === MergeStrategy.Disallowed) { |
| 15148 | throw new Error("A MergeStrategy of 'Disallowed' prevents " + entityKey.toString() + " from being merged"); |
| 15149 | } else if (mergeStrategy === MergeStrategy.SkipMerge) { |
| 15150 | updateEntityNoMerge(mc, targetEntity, node); |
| 15151 | } else { |
| 15152 | if (mergeStrategy === MergeStrategy.OverwriteChanges |
| 15153 | || targetEntityState.isUnchanged()) { |
| 15154 | updateEntity(mc, targetEntity, node); |
| 15155 | targetEntity.entityAspect.wasLoaded = true; |
| 15156 | if (meta.extraMetadata) { |
| 15157 | targetEntity.entityAspect.extraMetadata = meta.extraMetadata; |
| 15158 | } |
| 15159 | targetEntity.entityAspect.entityState = EntityState.Unchanged; |
| 15160 | targetEntity.entityAspect.originalValues = {}; |
| 15161 | targetEntity.entityAspect.propertyChanged.publish({ entity: targetEntity, propertyName: null }); |
| 15162 | var action = isSaving ? EntityAction.MergeOnSave : EntityAction.MergeOnQuery; |
| 15163 | em.entityChanged.publish({ entityAction: action, entity: targetEntity }); |
| 15164 | // this is needed to handle an overwrite of a modified entity with an unchanged entity |
| 15165 | // which might in turn cause _hasChanges to change. |
| 15166 | if (!targetEntityState.isUnchanged()) { |
| 15167 | em._notifyStateChange(targetEntity, false); |
| 15168 | } |
| 15169 | } else { |
| 15170 | if (targetEntityState == EntityState.Deleted && !mc.mergeOptions.includeDeleted) { |
| 15171 | return null; |
| 15172 | } |
| 15173 | updateEntityNoMerge(mc, targetEntity, node); |
| 15174 | } |
| 15175 | } |
| 15176 | } else { |
| 15177 | targetEntity = entityType._createInstanceCore(); |
| 15178 | |
| 15179 | updateEntity(mc, targetEntity, node); |
| 15180 | |
| 15181 | if (meta.extraMetadata) { |
| 15182 | targetEntity.entityAspect.extraMetadata = meta.extraMetadata; |
| 15183 | } |
no test coverage detected