编辑EF实体列表的有效方法

时间:2015-07-23 12:51:16

标签: c# algorithm entity-framework

我想了解您对使用EF更新包含子实体集合的实体的有效方法的看法。我对EF的内部运作并不十分熟悉。

我们假设我们有一个研究实体,它有许多中心实体。这两个表使用仅包含IdStudy和IdCenter的链接表进行链接。 属于研究的中心列表很容易改变。每项研究都有1到50个中心。

例如:初始选择是中心1,2,3,4。用户通过删除1,2并添加5,6来编辑列表。所以新的名单将是3,4,5,6。

更新数据库会有什么方法更有效?

  1. 删除所有现有条目。在新列表中插入所有项目。

  2. 确定什么是新的。确定应插入的内容。删除不再选择的内容。插入新内容。

  3. 对于新列表中的每个项目,请更新现有记录。如果新列表包含较少的元素,请删除其余记录。如果新列表中包含更多元素,请插入其余元素。

  4. 提前谢谢你。

2 个答案:

答案 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(谷歌它可以节省大量工作)是明智的。

http://automapper.org/