为什么“EntityKey与EntityKey中的相应值不匹配”?

时间:2011-08-25 11:54:37

标签: entity-framework c#-4.0

首先,我想显示相应的代码段。说到objCtx.AttachTo(),它会抛出一个错误:

Error: "The object cannot be attached because the value of a property that is a part of the EntityKey does not match the corresponding value in the EntityKey."

        // convert string fragIds to Guid fragIds 
        var fragIdsGuids = docGenResult.FragIds.Select(c => new Guid(c)).ToList();

        //add each fragment to document))))
        foreach (Guid fragIdsGuid in fragIdsGuids)
        {
            var fragment = new Fragment() { EntityKey = new EntityKey("DocTestObjectContext.Fragments", "ID", fragIdsGuid) };
            objCtx.AttachTo("Fragments", fragment);
        }
        objCtx.SaveChanges();

我已经检查了所有内容,但我没有错过任何主键。

但是我需要一些词来解释为什么我认为我必须这样做。

我在C#环境中使用EF4。 我在两个表之间存在多对多的关系,Document和Fragments(主键“ID”)(文档可以包含许多片段,片段可以是许多文档的一部分) 实体模型对我来说很好。

然而,当我尝试向DB添加新文档时,我已经掌握了相关碎片的ID。为了向DB添加新文档,我必须调用每个Fragmentobject并将其添加到document-object中的映射引用。这是一个瓶颈,因为文档可能有超过1000个碎片。结果是每个文档需要1秒。不多,但我必须创建超过3000个文档,保存第二个将导致更快的速度。

希望你知道这里有什么问题。

感谢。 托马斯

第一次修改:

这是实际工作的解决方案。我想避免加载所有片段,而只是保存我已经在映射表中的片段GUID。

        // convert string fragIds to Guid fragIds 
        var fragIdsGuids = docGenResult.FragIds.Select(c => new Guid(c)).ToList();
        // get responding entities from Fragment table
        var fragmentList = objCtx.Fragments.Where(c => fragIdsGuids.Contains(c.ID)).ToList();
        foreach (var fragment in fragmentList)
        {
            doc.Fragment.Add(fragment);
        }
        objCtx.SaveChanges();

第二次修改:

我觉得我尝试做的事情并不是很清楚。 但是,我想将Fragment表中的现有片段链接/引用到Document表中的同步Document。我想引用的文件是一个新文件。 Fragment表的文档有很多关系。这种关系在数据库上有一个链接表。在模型中,它被正确地建模为多对多关系。没关系。

到目前为止一切顺利。在我的第一次编辑中你可以看到什么是有效的。我必须通过id

为文档加载所有必需的片段
// get responding entities from Fragment table
    var fragmentList = objCtx.Fragments.Where(c => fragIdsGuids.Contains(c.ID)).ToList();

之后,我可以将它们添加到我的文档实体中:

foreach (var fragment in fragmentList)
    {
        doc.Fragment.Add(fragment);
    }

但为什么我要加载整个实体(片段)只是为了将它链接到一个新文档。为什么不告诉EntityStateManager“伙计,这里你有一些片段ID,链接它们!”?

此外,我试图在评论中关注Adrian提到的MSDN文章。这对我来说没有用。

1 个答案:

答案 0 :(得分:0)

我会试试这个:

    var fragment = new Fragment {ID = fragIdsGuid};
    //fragment.EntityKey.Dump(); // -- this should be null
    objCtx.AttachTo("Fragments", fragment);
   //fragment.EntityKey.Dump(); // -- shows the EntityKey object, created after the object is attached

转储功能来自LinqPad