DbContext.SaveChanges无法保存有效实体

时间:2013-03-05 06:56:37

标签: entity-framework-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应该如何行动?

2 个答案:

答案 0 :(得分:2)

这就是EF的工作方式。

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

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

答案 1 :(得分:0)

我做了一些挖掘。 EEF不会尝试编写实体。它首先调用Object Context中的验证。如果任何实体失败,它们将被添加到DbValidationResult并取消保存。

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

所有实体验证后,EF会根据需要将更改写入数据库。