Attach和EntityState.Detached

时间:2013-07-21 11:06:12

标签: entity-framework

为什么在这篇文章中: http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application 我们检查了Delete方法中的EntityState.Detached,然后在Update方法中我们没有检查:

    public virtual void Delete(TEntity entityToDelete)
    {
        if (context.Entry(entityToDelete).State == EntityState.Detached)
        {
            dbSet.Attach(entityToDelete);
        }
        dbSet.Remove(entityToDelete);
    }

    public virtual void Update(TEntity entityToUpdate)
    {
        dbSet.Attach(entityToUpdate);
        context.Entry(entityToUpdate).State = EntityState.Modified;
    }

2 个答案:

答案 0 :(得分:3)

两者不同的原因是因为在本教程中还有另一种调用delete的方法:

    public virtual void Delete(object id)
    {
        TEntity entityToDelete = dbSet.Find(id);
        Delete(entityToDelete);
    }

因此,如果从客户端事件调用了Delete(TEntity entityToDelete) - 它应该像在Update方法中一样被附加,但是如果它是从Delete(对象id)调用的,那么它将是服务器端处理的一部分附接。

为了安全起见:最好在进行更改之前始终检查它是否已附加,具体如下:考虑将来修订可能会发出一个可以调用也以同样的方式更新方法。

答案 1 :(得分:2)

必须。您可以执行更新和删除而无需附加。但是,它会导致您的代码变得不安全且更容易出错。

如果您尝试删除或更新分离的实体,您将获得一个例外,如果您没有计划处理它,您的应用程序将崩溃并停止工作......