首先我想显示相应的代码片段。当谈到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文章。这不适合我。
是在模型映射链接表(是它的有效载荷)? –
在模型中,我可以看到多对多的连接。两个表格之间的链接表是不可见的。 – Thomas
另一个问题来自朋友...... docGenResult变量与任何ObjectContext无关。 – Thomas