为什么在这篇文章中: 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;
}
答案 0 :(得分:3)
两者不同的原因是因为在本教程中还有另一种调用delete的方法:
public virtual void Delete(object id)
{
TEntity entityToDelete = dbSet.Find(id);
Delete(entityToDelete);
}
因此,如果从客户端事件调用了Delete(TEntity entityToDelete) - 它应该像在Update方法中一样被附加,但是如果它是从Delete(对象id)调用的,那么它将是服务器端处理的一部分附接。
为了安全起见:最好在进行更改之前始终检查它是否已附加,具体如下:考虑将来修订可能会发出一个可以调用也以同样的方式更新方法。
答案 1 :(得分:2)
应,必须。您可以执行更新和删除而无需附加。但是,它会导致您的代码变得不安全且更容易出错。
如果您尝试删除或更新分离的实体,您将获得一个例外,如果您没有计划处理它,您的应用程序将崩溃并停止工作......