c#Entity Framework将所有子项分配给新父项

时间:2013-09-18 19:03:41

标签: c# entity-framework entity-framework-5

Related Question

我正试图想出一种方法将所有子表重新分配给另一个父表。我目前正在使用EntityFramework 5与我的数据库进行交互。虽然使用EF不一定有效,但这种操作很少发生。

也就是说,使用EntityFramework对父对象进行基本更改很简单:

objChild.Parent = objNewParent;

调用SaveChanges()时,外键已正确更新。

如何获取所有相关实体,以便我可以迭代它们来分配新的父对象?我知道这需要反思,但到目前为止,我一直无法拼凑任何可用的东西。

我不关心表现。对数据库的调用次数,加载的数据总量,内存或cpu使用与此答案无关。关键是不知道哪些表存在的一般性质。

基本上,我正在尝试这样做,但是对于所有相关记录,而不是单一类型:

var sourceParents = ParentRecords.Where(n => sourceIds.Contains(n.Id));
var targetParent =  Participants.Find(targetId);
var childRecords =  sourceParents.SelectMany(n => n.ChildRecords).ToArray();

foreach (var child in childRecords) {
    child.ParentRecord = targetParent;
}

1 个答案:

答案 0 :(得分:2)

LINQ通常涉及较少量的代码这一事实往往被误解为提供更有效的解决方案。

您当前的代码所做的事情:

  • 通过ParentRecords进行一次迭代以获取父母列表 - > var sourceParents = ParentRecords.Where(n => sourceIds.Contains(n.Id));
  • 通过sourceParents进行一次迭代以获取子项列表 - > sourceParents.SelectMany(n => n.ChildRecords).ToArray();
  • 通过childRecords进行一次迭代以更改每个孩子的父级 - > foreach...

前两次迭代引用相同的对象(尽管是不同的子元素),您的代码可以简化为两个循环:

 var targetParent = Participants.Find(targetId);
 foreach (var parent in ParentRecords)
 {
     if (parent == null) continue;
     if (sourceIds.Contains(parent.Id))
     {
         //Assigning the new parent to all the children
         foreach (var child in parent.ChildRecords)
         {
             if (child == null) continue;
             child.ParentRecord = targetParent;  
         }
     }
 }

我认为你不能在当前条件下更快地做事(除了转向效率更高Types,依靠最大化硬件资源或改变输入数据结构的方法来提高效率更新操作)。如果在update_the_parents_for_all_my_records()的行上有一个函数,请记住它基本上会做同样的事情:遍历所有元素。小代码大小的方法在某些条件下可以很好,但往往比大代码方法的适应性差。在任何情况下,都不应该误解它们:代码的长度与其实际效率没有直接关系(即代码在每种情况下实际执行的操作)。