Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 编辑EF实体列表的有效方法_C#_Algorithm_Entity Framework - Fatal编程技术网

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

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 什么方法更新数据库更有效 删除所有现有条目。在新列表中插入所有项目 确定什么是新的。确定应该插入的内容。删除不再选中的内容

我想知道您对使用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。