如果任何写操作由于任何原因失败,整个事务将被回滚,并且不会持久化任何更改。
我使用EF 5与Code First POCO。
下面是存储库的SaveChanges实现:
public virtual List<DbEntityValidationResult> SaveChanges()
{
var errors = new List<DbEntityValidationResult>();
try
{
DbContext.SaveChanges();
}
catch (DbEntityValidationException ex)
{
errors.AddRange(ex.EntityValidationErrors);
}
return errors;
}
单个验证错误导致没有实体被写入数据库。
这是EF应该做的吗?
这就是EF的工作方式。
SaveChanges()
创建一个事务,并尝试保存上下文中的所有更改。
我做了更多的调查。EEF不尝试写实体。它首先从对象上下文调用验证。如果任何实体失败,它们将被添加到DbValidationResult,并取消保存。
对于批量事务,您可以删除这些实体并处理任何错误,然后重新保存。
一旦所有的实体验证,EF将适当地将更改写入数据库。