编辑EF实体列表的有效方法
本文关键字:有效 方法 列表 EF 实体 编辑 | 更新日期: 2023-09-27 18:04:29
我想知道您对使用EF更新包含子实体集合的实体的有效方法的看法。我对EF的内部工作不是很熟悉。
假设我们有一个Study实体,它有许多Center实体。这两个表使用一个仅包含IdStudy和IdCenter的链接表进行链接。属于一项研究的中心列表可以很容易地改变。每个研究都有1到50个中心。
例如:初始选择为中心1,2,3,4。用户通过删除1、2和添加5、6来编辑列表。所以新列表就是3,4,5,6。
哪种方法更新DB更有效?
-
删除所有已存在的条目。在新列表中插入所有项
-
确定什么是新的。确定应该插入什么。删除不再选中的内容。插入新的。
-
对于新列表中的每一项,更新现有记录。如果新列表的元素较少,则删除剩余的记录。如果新列表中有更多元素,则插入其余元素。
提前谢谢你。
我个人总是选择第一个选项。编写必要时更新所有内容的代码,然后删除正确的记录,实在是太麻烦了。
你可以用实体框架很快地删除所有的,你甚至可以在一个事务中完成。所以我选择第一个选项。代码更少,更容易阅读,更容易维护。
当然,如果您想保持审计跟踪(在编辑之前选中的中心是什么?),这种方法是不可行的,或者您将不得不考虑其他一些方法来实现审计跟踪。
是的,如果列表增长非常大(假设50条记录),那么插入50行确实会变慢。尽管如此,您的代码不太可能包含任何错误,因为它非常简单。删除本研究的所有中心。为本研究插入新的中心。这也节省了时间。
所以简而言之:如果性能不是绝对关键的,花额外的毫秒在数据库上执行插入操作,而不是编写只更新/插入更改记录的代码。
我更喜欢的方法是添加一些标志属性。
假设你有一个EF实体:
class Center{
public int ID { get; set; }
public string Name { get; set; }
}
现在,我们创建DTO对象(避免一些不必要的编辑),如下所示:
class CenterDTO{
public int ID { get; set; }
public string Name { get; set; }
//flag properties
public bool IsDeleted {get; set;}
public bool IsUpdated {get; set;}
public bool IsAdded {get; set;}
}
现在,在添加/更新/删除对象后,我们知道它是否被编辑,删除或更新,因此我们可以对每个实体采取适当的方法。
顺便说一句。对于这种方法,使用AutoMapper是明智的(Google一下,节省很多工作)
http://automapper.org/