2011-08-25 30 views
1

首先我想显示相应的代码片段。当谈到objCtx.AttachTo()它会引发我一个错误:为什么“EntityKey与EntityKey中的对应值不匹配”?

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。 我有两个表之间的多对多关系,文档和片段(主键“ID”)(文档可以有很多片段,片段可以是许多文档的一部分) 实体模型适合我。

但是,当我尝试向数据库添加一个新文档时,我手中已经有了相关碎片的ID。为了向数据库添加新文档,我必须调用每个Fragmentobject并将其添加到我的文档对象中映射的引用。这是一个瓶颈,因为一个文档可能有超过1000个片段。结果是我需要每个文件1秒。没有太多,但我必须创建超过3000个文件,节省这一秒会导致更多的速度。

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

谢谢。 托马斯

1日编辑:

这里是解决至极实际工作。我想避免加载所有的片段,而只是保存我已经在映射表中的片段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(); 

2日编辑:

我有一种感觉,它是不是真的清楚我尝试做。 但是,我想链接/引用片段表中的现有片段到文档表中的核心申请文档。我想参考的文件是一个新文件。 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文章。这不适合我。

+0

是在模型映射链接表(是它的有效载荷)? –

+0

在模型中,我可以看到多对多的连接。两个表格之间的链接表是不可见的。 – Thomas

+0

另一个问题来自朋友...... docGenResult变量与任何ObjectContext无关。 – Thomas

回答

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

+0

感谢您的回复。不幸的是没有为我工作。抛出了一个InvalidOperationException异常:“ObjectStateManager中已存在具有相同键的对象,ObjectStateManager无法使用相同的键追踪多个对象。” :( – Thomas

+0

问题是你的上下文中存在一个带有Guid的片段,当你尝试附加它时,它会给出这个错误。或者你用其他文档加载它,或者Guid不是唯一的。 –

+0

你是对的。但我怎么能告诉ObjectStateManager他应该接受我现有片段的密钥而不加载整个片段?我想避免所有片段的加载过程。除了将它们链接到新的片段外,我不需要它们 – Thomas

相关问题