DbEntityValidationException但数据有效 - 如何调试?

时间:2012-11-11 02:54:40

标签: asp.net-mvc-3 entity-framework

我从控制器方法获得DbEntityValidationException,该方法试图在从DB检索的实体上设置布尔值IsVisible。它响应了页面上勾选框中更改的AJAX帖子。这段代码以前都有用。

var targetClass = db.Classes.FirstOrDefault(x => x.ID == cid);
targetClass.IsVisible = true;
db.SaveChanges();

这会导致DbEntityValidationException出现以下错误:

The SchoolYear field is required.
The TuitionPlan field is required.

当我单步执行此代码时,targetClass.SchoolYeartargetClass.TuitionPlan都有效。

问题是,我如何找出为什么EF认为这些字段丢失了?

编辑:这可能与(太)延迟加载有关...如果我使用两个“缺失”字段,则错误消失。可能没有什么比不知道为什么一个严重的问题刚离开更令人担忧。

var targetClass = db.Classes.FirstOrDefault(x => x.ID == cid);
targetClass.IsVisible = value;
int x = targetClass.TuitionPlan.ID;
x = targetClass.SchoolYear.ID;
db.SaveChanges();

我真的需要有人来解释这里发生了什么,以及我将来如何防止这种情况发生。

感谢您的见解, 埃里克

1 个答案:

答案 0 :(得分:0)

我不认为针对null验证导航属性是个好主意。设置为null的导航属性意味着没有相关实体(您要验证的条件),但也可能意味着尚未加载关联实体。现在,向数据库发送一个额外的查询只是为了验证它是否有一个过度杀伤并可能导致性能问题(首先,你可能会向数据库发送大量查询,第二个(除非你加载实体不是跟踪)你开始跟踪你真正需要跟踪的更多实体)。另请注意,出于上述原因,验证会在验证完成之前禁用延迟加载。即使您的应用程序延迟加载已启用,这可能是您看到错误的原因。在验证期间,它将被禁用,访问导航属性将不会加载相关实体。如果要验证相关实体是否存在,可以使用外键。请注意,它不需要加载相关实体,应该相对容易。