首先,我想展示相应的代码片段。当涉及到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#环境中使用C#。我在两个表、文档和片段(主键"ID")之间有很多到多个关系(文档可以有很多片段,一个片段可以是许多文档的一部分)实体模型对我来说工作得很好。
但是,当我试图向DB添加一个新文档时,我已经掌握了相关片段的in。要将新文档添加到DB中,我必须调用每个Fragmentobject并将其添加到文档对象中的映射引用中。这是一个瓶颈,因为一个文档可能有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();第二版编辑:
我有一种感觉,我不太清楚我想做什么。但是,我想将片段表中的现有片段链接/引用到文档表中的编码响应文档。我想要参考的这份文件是新的。文档到片段表有许多到多个关系。此关系在数据库上有一个链接表。在模型中,它被正确地建模为多到多的关系。这很好。
到目前一切尚好。你能在我的第一次编辑中看到什么才是可行的。我必须按它们的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,链接它们!”
此外,我试图跟随禤浩焯在评论中提到的MSDN文章。这对我来说不太好。
发布于 2011-08-25 13:16:45
我试试这个:
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
https://stackoverflow.com/questions/7189893
复制相似问题