Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Sql server 使用EF 6和存储库执行删除的最佳方式是什么?_Sql Server_Entity Framework_Entity Framework 6 - Fatal编程技术网

Sql server 使用EF 6和存储库执行删除的最佳方式是什么?

Sql server 使用EF 6和存储库执行删除的最佳方式是什么?,sql-server,entity-framework,entity-framework-6,Sql Server,Entity Framework,Entity Framework 6,我正在查看来自两个不同存储库的这两个示例: public virtual void Delete(T entity) { DbEntityEntry dbEntityEntry = DbContext.Entry(entity); if (dbEntityEntry.State != EntityState.Deleted) { dbEntityEntry.State = EntityState.Delete

我正在查看来自两个不同存储库的这两个示例:

    public virtual void Delete(T entity)
    {
        DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
        if (dbEntityEntry.State != EntityState.Deleted)
        {
            dbEntityEntry.State = EntityState.Deleted;
        }
        else
        {
            DbSet.Attach(entity);
            DbSet.Remove(entity);
        }
    }

   public virtual void Delete(T entity) {
        dbset.Remove(entity);
   }
有人能解释一下区别吗。为什么第一本书的作者添加了所有额外的行

使用EF 6和存储库执行删除的最佳方式是什么

我不能回答你的问题。原因如下

如果要通过实体框架删除对象,必须满足两个条件:

  • 对象必须附加到上下文
  • 对象必须处于
    已删除
    状态
first
Delete
方法的目的似乎是确保在运行后满足这两个条件。但这并不像看上去那么简单。它必须嗅出对象的当前状态,必要时附加它,必要时设置它的状态。而且,甚至还没有考虑到,它还必须确保它没有附加到任何其他上下文。这和Anthony Chu的评论表明,第一种方法还不够复杂

因此,请保持简单,并使用第二个方法?第二种方法假定调用代码知道只调用
dbset.Remove是可以的,它知道第一种方法试图发现的所有事情。但是,如果它已经那么聪明了,为什么调用
DbSet.Remove直接删除
会太愚蠢呢?(除了第二种方法本身相当愚蠢之外,正如蒂莫西·沃尔特斯指出的那样)

然后,有三种方法将对象标记为已删除:

  • DbSet中删除它
  • DbEntityEntry
    的状态标记为
    Deleted
  • (在某些情况下)
    将其从父对象的子集合中删除
试图将所有删除限制为调用一个存储库方法可能是编写最佳代码的一大限制


这就是为什么我不能回答你的问题。无论如何,我不相信在
DbSet
之上有存储库层。因此,对我来说,执行删除的最佳方式取决于每个用例的代码是什么样子。

在linq to SQL中,您可以“删除”内容,在EF中,您可以“删除”内容。他们完成同样的任务。我猜Delete方法是作为包装器创建的,这样在从linq切换到SQL再切换到EF时,它们就不必更新那么多现有代码了。。。如果该实体已存在于
已添加
状态的上下文中,则当该实体应被
分离时,它将被更改为
已删除
。如果一个实体已经处于
Deleted
状态,我不知道为什么它需要重新附加并再次标记为
Deleted
。不要陷入使事情过于复杂的陷阱,EF是你的存储库,将它包装在另一层会降低代码的可读性和功能。当然,在这里和那里添加一些助手,但是正确地使用它和它给你的所有力量,不要在你的呼叫代码上戴上儿童手套。哦,第二个是正确的方法,
dbset.Remove(entity)的包装。有助于说明这对于存储库来说是多么毫无意义。