2013-03-05 186 views
0

我使用的是Code First POCO的EF 5。DbContext.SaveChanges无法保存有效的实体

这里是库的调用SaveChanges实现:

public virtual List<DbEntityValidationResult> SaveChanges() 
    { 
     var errors = new List<DbEntityValidationResult>(); 
     try 
     { 
      DbContext.SaveChanges(); 
     } 
     catch (DbEntityValidationException ex) 
     { 
      errors.AddRange(ex.EntityValidationErrors); 
     } 

     return errors; 
    } 

单验证错误不会导致实体被写入到数据库中。我曾经期望写出有效的实体并接收无效实体的错误。

这是EF如何行事?

回答

0

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

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

所有实体验证完成后,EF会根据情况将更改写入数据库。

2

这就是EF的工作方式。

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

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

+0

谢谢。我编写代码来处理不适当的实体并保存适当的实体。 – rkralston 2013-05-02 13:15:19