我想了解您对使用EF更新包含子实体集合的实体的有效方法的看法。我对EF的内部运作并不十分熟悉。
我们假设我们有一个研究实体,它有许多中心实体。这两个表使用仅包含IdStudy和IdCenter的链接表进行链接。 属于研究的中心列表很容易改变。每项研究都有1到50个中心。
例如:初始选择是中心1,2,3,4。用户通过删除1,2并添加5,6来编辑列表。所以新的名单将是3,4,5,6。
更新数据库会有什么方法更有效?
删除所有现有条目。在新列表中插入所有项目。
确定什么是新的。确定应插入的内容。删除不再选择的内容。插入新内容。
对于新列表中的每个项目,请更新现有记录。如果新列表包含较少的元素,请删除其余记录。如果新列表中包含更多元素,请插入其余元素。
提前谢谢你。
答案 0 :(得分:6)
我个人总是选择第一个选项。编写代码可以在必要时更新所有内容,并在之后删除正确的记录,这太麻烦了。
您可以使用Entity Framework快速删除所有内容,甚至可以在事务中完成所有操作。所以我选择第一个选项。代码更少,更易于阅读,更易于维护。
当然,如果你想保留审计线索(在编辑之前曾经是选定的中心?),这种方法是不可行的,或者你必须考虑其他一些方法来实施审计踪迹。
是的,如果列表变得非常大(假设有50条记录),那么插入50行会变慢。尽管如此,您的代码很少包含任何错误,因为它非常简单。删除本研究的所有中心。为本研究插入新的中心。这也节省了时间。
简而言之:如果性能不是绝对关键,那么花费额外的毫秒数对数据库执行插入操作,而不是编写只更新/插入更改记录的代码。
答案 1 :(得分:3)
我更喜欢的方法是添加一些标志属性。
假设您有一个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(谷歌它可以节省大量工作)是明智的。