C# 编辑EF实体列表的有效方法
我想知道您对使用EF更新包含子实体集合的实体的有效方法的看法。我不太熟悉EF的内部工作原理 假设我们有一个研究实体,它有许多中心实体。这两个表使用仅包含IdStudy和IdCenter的链接表进行链接。 属于某项研究的中心列表很容易更改。每项研究都有1到50个中心 例如:初始选择是中心1,2,3,4。用户通过删除1,2并添加5,6来编辑列表。因此,新的列表将是3,4,5,6 什么方法更新数据库更有效C# 编辑EF实体列表的有效方法,c#,algorithm,entity-framework,C#,Algorithm,Entity Framework,我想知道您对使用EF更新包含子实体集合的实体的有效方法的看法。我不太熟悉EF的内部工作原理 假设我们有一个研究实体,它有许多中心实体。这两个表使用仅包含IdStudy和IdCenter的链接表进行链接。 属于某项研究的中心列表很容易更改。每项研究都有1到50个中心 例如:初始选择是中心1,2,3,4。用户通过删除1,2并添加5,6来编辑列表。因此,新的列表将是3,4,5,6 什么方法更新数据库更有效 删除所有现有条目。在新列表中插入所有项目 确定什么是新的。确定应该插入的内容。删除不再选中的内容
先谢谢你 就我个人而言,我总是选择第一个选项。编写必要时更新所有内容并在事后删除正确记录的代码太麻烦了 您可以使用EntityFramework非常快速地删除所有内容,甚至可以在事务中删除所有内容。所以我会选择第一个选项。它的代码更少,更容易阅读和维护 当然,如果您想保留审核跟踪(编辑前所选中心是什么?),此方法不可行,或者您必须考虑其他方法来实施审核跟踪 是的,如果列表变得相当大(比如说50条记录),那么插入50行确实会变慢。尽管如此,您的代码仍然不太可能包含任何bug,因为它非常简单。删除此研究的所有中心。为这项研究插入新的中心。这也节省了时间
因此,简而言之:如果性能不是绝对关键的,那么就花额外的毫秒在数据库上执行insert操作,而不是编写只更新/插入更改的记录的代码。我更喜欢的方式是添加一些标志属性 假设您有一个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(谷歌it,节省了大量工作)是明智的
如果“高效”意味着代码更少,我同意。如果它意味着更好的性能,那么根据列表的大小,选项1比只插入新的和删除旧的要慢。另外,如果你有一种审计跟踪,那么选项1也不是很好。你肯定是对的。我已经更新了我的答案。你是在问代码效率,还是数据库效率?如果您使用EF,您不必担心数据库中会发生什么:您可以正确管理列表,EF将根据数据库中最新模型与您要保存的模型的比较来处理删除/插入/更新。我猜它会选择选项2。