3

为什么在这篇文章中: 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 我们检查了 EntityState.Detached 是否在 Delete 方法中,然后在 Attach 和在 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;
    }
4

2 回答 2

3

两者不同的原因是因为在教程中有另一个调用删除的方法:

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

因此,如果从客户端事件调用 Delete(TEntity entityToDelete) - 它应该像在 Update 方法中一样首先附加,但如果作为服务器端处理的一部分从 Delete(object id) 调用它,它将已经附加。

为了安全起见:最好在进行更改之前始终检查它是否已附加,特别是:考虑到将来修订版可能会发布一个服务器方法,该方法也可以以相同的方式调用 Update 方法。

于 2013-07-21T11:18:17.813 回答
2

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

如果您尝试删除或更新分离的实体,您将遇到异常,如果您没有计划处理它,您的应用程序将崩溃并停止工作......

于 2013-07-22T03:05:50.957 回答