EF 4.1 CodeFirst GetValidationErrors

时间:2012-09-18 12:58:58

标签: entity-framework-4 ef-code-first dbcontext

如果我在地图文件中定义了下一个(单位和机器之间的1对多关系):

this.HasRequired(t => t.Unit)
    .WithMany(t => t.Machines)
    .HasForeignKey(d => d.UnitId);

当我添加新实体时,Machine.UnitOfMeasurement = null,sp为什么DbContext在调用GetValidationErrors时没有返回验证问题,我该怎么做才能检测它们。如果我允许EF尝试更新,它将向用户返回无意义的消息,如外键引用错误,而我可以从DbEntityValidationResult(发出验证错误的属性名称)提取有意义的信息。

我使用IDataErrorInfo作为验证规则,而不是属性。

1 个答案:

答案 0 :(得分:1)

EF验证不会验证导航属性。这样做的原因是导航属性可能为null,不是因为相关实体不存在,而是因为启用了延迟加载并且未加载相关实体。此外,即使导航属性为null,您也可能设置了相应的外键属性,这基本上意味着存在关系,但导航属性尚未更新。另请注意,强制加载相关实体意味着验证会将整个数据库带入内存(在加载相关实体后,将验证将导致加载新加载实体的相关实体的内容等) - 您不希望这种情况发生(EF实际上会在验证期间关闭延迟加载以防止这种情况发生)。 EF验证不支持IDataErrorInfo - 仅支持验证属性和IValidatableObject。