意外的“此EntitySet中已存在具有相同标识的实体”?

时间:2012-01-05 15:29:07

标签: c# silverlight wcf-ria-services

尝试添加到客户端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);

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

在调查DomainContext的EpisodeDictionaryMap集合时,看起来有时实际上有多个'New'EpisodeDictionaryMap实例,每个实例都有0的Id,正如我在保存之前所期望的那样,并且在这些情况下保存完成没有问题,并将正确的ID分配给客户端实体。

鉴于在任何时候在EntitySet中有多个Id为0的条目似乎不是一个问题(至少在它们处于“新”状态时),不明白错误信息试图告诉我的内容。

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

建议,想法?非常感谢!

修改

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

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)

2 个答案:

答案 0 :(得分:0)

验证相关表的主键(在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: Bug in StoreGeneratedPattern SSDL

答案 1 :(得分:0)

经过大量的反复试验后,我发现只是间接连接到错误实体的实体仍然在上下文中闲逛,并保持身份0的实体。我一直在清除包含非查找数据的每个EntitySet - 事实证明这就足够了。在VS中进行调查并没有为我提供一个简单的方法来实际找到有问题的实体,但是使用ANTS进行分析时发现了一些与我的“查找”EntitySet实体相关的太多东西。

我的'修复'是为了清除我的所有EntitySet,如下所示:

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

令我感到困惑的是,这是一个间歇性的错误;有时,具有Id T的{​​{1}}类型的多个实体位于上下文中,并且有时会出错。