我正在使用 GraphDiff 来更新复杂的对象图。我的主要实体有多个可以创建、更新或删除的子实体(graphDiff 中的 OwnedCollections)。因此,在 GraphDiff 中,当实体更新时,正在创建实体的不同副本,您必须获取此副本才能获取新创建实体的 ID 等。我遇到了以下问题:当我将实体添加到child 集合,返回的“母亲”实体有两次相同的孩子。我已经下载了代码,CollectionGraphNode 中的以下代码似乎导致了这个问题:
private object AddElement<T>(IChangeTracker changeTracker, IEntityManager entityManager, T existing, object updateItem, object dbCollection)
{
// My comment: input parameter dbCollection contains the existing child Entities
if (!_isOwned)
{
updateItem = changeTracker.AttachAndReloadAssociatedEntity(updateItem);
}
else if (changeTracker.GetItemState(updateItem) == EntityState.Detached)
{
var instance = entityManager.CreateEmptyEntityWithKey(updateItem);
// My comment: dbCollection here has existing children (e.g.1)
changeTracker.AddItem(instance);
changeTracker.UpdateItem(updateItem, instance);
//My comment: dbCollection here has +1 (2)
foreach (var childMember in Members)
{
childMember.Update(changeTracker, entityManager, instance, updateItem);
}
updateItem = instance;
}
dbCollection.GetType().GetMethod("Add").Invoke(dbCollection, new[] {updateItem});
//My comment: dbCollection here has again +1 and thus twice my new entity
if (_isOwned)
{
changeTracker.AttachCyclicNavigationProperty(existing, updateItem, GetMappedNaviationProperties());
}
return updateItem;
}
我知道我的问题非常具体,但 GraphDiff 是我最后希望我能够以一种简洁的方式更新我的对象。我在 EF 中不是那么好,我试图了解上述两行代码如何在列表中两次添加我的实体。我的子实体引用了父实体,这会导致额外的添加吗?有没有人遇到过类似的问题,您是如何解决的?