GraphDiff复制返回的实体

时间:2014-11-14 17:37:34

标签: c# entity-framework graphdiff

我正在使用GraphDiff来更新复杂的对象图。我的主要实体有多个子项可以创建,更新或删除(graphDiff中的OwnedCollections)。因此,在GraphDiff实体更新时,正在创建实体的不同副本,您必须获取此副本才能获得新创建的实体的ID等。 我遇到了以下问题:当我将一个实体添加到子集合时,返回的“母亲”实体具有两次相同的子节点。我已经下载了代码,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中并不是那么好,我试图理解上面两行代码如何在列表中添加我的实体两次。我的孩子实体引用了父母,是否会引起额外的添加?有没有人有类似的问题,你是如何解决的?

0 个答案:

没有答案