首先,我想显示相应的代码段。说到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文章。这对我来说没有用。
答案 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