实体框架5 - DbContext.SaveChanges保存有效实体失败



我使用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将适当地将更改写入数据库。

最新更新