0

我将 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应该采取的行动吗?

4

2 回答 2

2

这就是EF的工作方式。

SaveChanges()创建一个事务并尝试保存上下文中的所有更改。

如果任何写入因任何原因失败,则整个事务将回滚并且不会保留任何更改。

于 2013-03-05T07:03:47.243 回答
0

我做了更多的挖掘。EEF 不会尝试写入实体。它首先从对象上下文调用验证。如果任何实体失败,则将它们添加到 DbValidationResult 并取消保存。

对于批量交易,您可以删除这些实体并处理任何错误,然后重新保存。

一旦所有实体都通过验证,EF 会根据需要将更改写入数据库。

于 2013-11-13T22:51:38.740 回答