0

我从一个控制器方法中得到一个 DbEntityValidationException,该方法试图在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.SchoolYear都是targetClass.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();

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

感谢您的洞察力,埃里克

4

1 回答 1

0

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

于 2012-11-11T05:30:38.167 回答