意外的“;具有相同标识的实体已经存在于该EntitySet“中;

本文关键字:存在 于该 EntitySet 意外 标识 实体 | 更新日期: 2023-09-27 18:19:36

尝试添加到客户端EntitySet时出错。以下代码在Add方法上间歇性失败。

// On the DB side this has a primary key field of IDENTITY(1,1) called Id
var map = new EpisodeDictionaryMap();
map.DictionaryName = dictionary; // String
map.Section = section; // String
map.DictionaryVersion = version; // Int32
episode.EpisodeDictionaryMap.Add(map);

我还在EpisodeEpisodeDictionaryMap(以及其他)的EntitySet上调用Clear(),不是在每次调用此代码之前,而是在用户更改到应用程序中的不同屏幕时不时调用。这是最近的变化,所以可能是问题的一部分。

在调查DomainContext的EpisodeDictionaryMap集合时,会发现有时实际上有多个"新"EpisodeDictionaryMap实例,每个实例的Id都为0,正如我在保存之前所期望的那样,在这些实例中,保存完成时不会出现问题,并且将正确的Id分配给客户端实体。

考虑到在EntitySet中同时有多个Id为0的条目似乎不是问题(至少在它们处于"新"状态时),我不明白错误消息试图告诉我什么。

在一些相关的SO问题上,我注意到作文可能是一个问题,但我没有使用它。除了情节引用本身,也没有其他外键引用,这似乎有时也会导致这个错误。

建议,想法?非常感谢!

编辑

完全异常(不存在内部异常)

System.InvalidOperationException occurred
    Message=An entity with the same identity already exists in this EntitySet.
StackTrace:
    at System.ServiceModel.DomainServices.Client.EntitySet.AddInternal(Entity entity)
    at System.ServiceModel.DomainServices.Client.EntitySet.<Add>b__5(EntitySet l, Entity e)
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.Visit(Entity entity)
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.VisitEntityCollection(IEntityCollection entityCollection, PropertyInfo propertyInfo)
    at System.ServiceModel.DomainServices.Client.EntityVisitor.Visit(Entity entity)
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.Visit(Entity entity)
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.VisitEntityRef(IEntityRef entityRef, Entity parent, PropertyInfo propertyInfo)
    at System.ServiceModel.DomainServices.Client.EntityVisitor.Visit(Entity entity)
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.Visit(Entity entity)
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.VisitEntityRef(IEntityRef entityRef, Entity parent, PropertyInfo propertyInfo)
    at System.ServiceModel.DomainServices.Client.EntityVisitor.Visit(Entity entity)
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.Visit(Entity entity)
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.Infer(EntityContainer container, Entity entity, Action`2 action)
    at System.ServiceModel.DomainServices.Client.EntitySet.Add(Entity entity)
    at System.ServiceModel.DomainServices.Client.EntityCollection`1.Add(TEntity entity)
    at TangoSoft.Client.EpisodeExtensions.SaveDictionaryVersion(Episode episode, String dictionary, String section, Int32 version)

意外的“;具有相同标识的实体已经存在于该EntitySet“中;

验证有问题表的主键(在xml中提取.edmx文件)在两个部分中都具有StoreGeneratedPattern="Identity"。有一个已知的错误,EF通过设计器修改了一个部分,但没有修改另一个部分。在这两个部分中查找:

<EntityType Name="TIMELINE">
          <Key>
            <PropertyRef Name="ID"/>
          </Key>
  <Property Name="ID" Type="decimal" Nullable="false" Precision="19" StoreGeneratedPattern="Identity" />

请参阅EF4:StoreGeneratedPattern中的Bug SSDL

经过多次尝试和错误后,我发现一个仅间接连接到出错实体的实体仍在上下文中徘徊,并保留了一个id为0的实体。我一直在清除每个包含非查找数据的EntitySet,结果发现这还不够。在VS中进行调查并不能为我提供一种简单的方法来真正找到有问题的实体,然而,ANTS的分析显示,有太多的东西只与我的"查找"EntitySet实体有关。

我对此的"修复"是现在清除我的所有EntitySet,如下所示:

foreach (var set in _context.EntityContainer.EntitySets)
{
    set.Clear();
}

仍然让我困惑的是,这是一个间歇性的错误;有时上下文中有多个Id为0的类型为T的实体并不重要,有时会出错。

相关文章: