代码之家  ›  专栏  ›  技术社区  ›  Tri Q Tran

自跟踪实体-AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突

  •  12
  • Tri Q Tran  · 技术社区  · 15 年前

    我已经被这个问题困扰了一个多星期了。希望有人能给我指出正确的方向。

    我先简单描述一下我的模式。

    资产1--->1地址*-->1个区域*-->1个地区*-->1个国家

    使用自跟踪实体(STE)+WCF。

    步骤:

    1. 调用数据存储获取包列表。
    2. 保存包。

    from p in context.Assets.Include("Address.Area.Region.Country")
    

    这是尝试调用时的错误

    context.Packages.ApplyChanges(package)
    

    对象的键值与 另一个物体 ObjectStateManager。确保 接受变化。

    编辑

    here . 这是我的问题。

    如何将实体添加到实体 包含相同内容的相关实体 已在集合中的密钥。 即,添加一个可能包含 国家实体。

    1. 我无法预取将涉及的所有实体,因为数据集太大。
    2. 我必须能够采取快照的实体在任何时候,以保持历史和使用它来“撤消”任何更改。

    我知道委员会建议的可能解决办法 迭戈B织女星

    5 回复  |  直到 15 年前
        1
  •  8
  •   divega Rene Schulte    15 年前

    仅供参考,我写了一篇博文,对我在EF论坛上已经回复的内容提出了一些额外的建议。 Here 是博客帖子。

        2
  •  8
  •   ZXX    15 年前

    如果你知道我的意思的话,你有没有考虑过放弃ORM-s,回到正常访问

    尤其是因为您似乎有非常干净的模式-这意味着非常简单的查询和直接的更新。

        3
  •  3
  •   drchip.PL    15 年前

    以下是我所做的:

    公共静态空区 CustomApplyChanges(此 ObjectContext,字符串 entitySetName,TEntity实体, 排除类型 IObjectWithChangeTracker

    1. 向for循环添加一个条件以排除excludeTypes数组中包含的任何类类型。

    区域句柄初始实体状态

    foreach(IObjectWithChangeTracker) 变化 entityIndex.allenties.Where(x=> !excludeTypes.Contains(x.GetType())) 实体索引,所有关系, 变化);}

    foreach(IObjectWithChangeTracker) 变化 x、 ChangeTracker。状态= 对象状态。已删除 &&

    末端区域

    Type[]excludeTypes={typeof(Asset),typeof(Address),typeof(Region)};

    rep.Entities.CustomApplyChanges(实体,排除类型); var changedEntry=rep.Context.ObjectStateManager.GetObjectStateEntries>(System.Data.EntityState.Added | System.Data.EntityState.Modified | System.Data.EntityState.Deleted); { { rep.Context.Detach(实体)//分离未更改的对象 } }

        4
  •  1
  •   Mark Redman    13 年前

    我通过设置重置外键id来解决这个问题,这需要在保存之前将导航值设置为null。

    var countryToId = address.CountryToId;
    var countryFromId = address.CountryFromId;
    documentAddress.CountryTo = null;
    documentAddress.CountryFrom = null;
    documentAddress.CountryToId = countryToId;
    documentAddress.CountryFromId = countryFromId;
    
        5
  •  0
  •   gunnerz    12 年前

    由于在此实体上启用了自跟踪,因此不允许添加具有相同密钥的记录,即使具有该密钥的记录已在之前删除。

    dbcontext.entity.MergeOption = System.Data.Objects.MergeOption.NoTracking;