diff --git a/src/mapping-context.ts b/src/mapping-context.ts index a347c25..9777100 100644 --- a/src/mapping-context.ts +++ b/src/mapping-context.ts @@ -1,4 +1,4 @@ -import { DataServiceAdapter } from './interface-registry'; +import { DataServiceAdapter } from './interface-registry'; import { core } from './core'; import { DataType } from './data-type'; import { DataService, JsonResultsAdapter, NodeContext, NodeMeta } from './data-service'; @@ -304,8 +304,8 @@ function mergeEntity(mc: MappingContext, node: any, meta: NodeMeta) { if (meta.extraMetadata) { targetEntity.entityAspect.extraMetadata = meta.extraMetadata; } - // em._attachEntityCore(targetEntity, EntityState.Unchanged, MergeStrategy.Disallowed); - em._attachEntityCore(targetEntity, EntityState.Unchanged, mergeStrategy); + // return value === targetEntity EXCEPT in the case of a merge with a self reference. + targetEntity = em._attachEntityCore(targetEntity, EntityState.Unchanged, mergeStrategy); targetEntity.entityAspect.wasLoaded = true; em.entityChanged.publish({ entityAction: EntityAction.AttachOnQuery, entity: targetEntity }); } @@ -395,6 +395,13 @@ function mergeRelatedEntityCore(mc: MappingContext, rawEntity: any, navigationPr let relatedRawEntity = rawEntity[navigationProperty.nameOnServer]; if (!relatedRawEntity) return null; + if (rawEntity.$type === relatedRawEntity.$type) { + if (navigationProperty.parentType.keyProperties.every(kp => rawEntity[kp.nameOnServer] === relatedRawEntity[kp.nameOnServer])) { + //the related entity is a duplicate of the parent entity, ignore it + return null; + } + } + let relatedEntity = mc.visitAndMerge(relatedRawEntity, { nodeType: "navProp", navigationProperty: navigationProperty }); return relatedEntity; }