Entity framework 4 EF 4.1 CodeFirst GetValidationErrors

Entity framework 4 EF 4.1 CodeFirst GetValidationErrors,entity-framework-4,ef-code-first,dbcontext,Entity Framework 4,Ef Code First,Dbcontext,如果我在映射文件中定义了下一步(单元和机器之间的1对多关系): 当我添加新实体Machine.UnitOfMeasurement=null时,为什么DbContext在调用GetValidationErrors时不返回验证问题,以及我可以如何检测它们。若我允许EF尝试更新,它将向用户返回无意义的消息,如外键引用错误,而我可以从DbEntityValidationResult(发出验证错误的ex属性名)提取有意义的信息给用户 我将IDataErrorInfo用于验证规则,而不是属性。EF验证不会验

如果我在映射文件中定义了下一步(单元和机器之间的1对多关系):

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


我将IDataErrorInfo用于验证规则,而不是属性。

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

如果在映射中设置为必需,EF检查引用属性中是否有值不是正常的期望吗?此时,我们不关心输入的值是否正确,我们只关心通知用户NULL不可接受。您需要这里讲的是实体上有Reference和ReferenceId的情况,我们设置ReferenceId,如果这个对象没有加载到内存中,那么Reference可以为null。我同意这一点,但如果我们设置ForeignKey(“ReferenceId”)在Reference属性上,如果Reference包含null,则期望EF检查ReferenceId是否已设置,这不是很正常吗?1)否。如果导航属性为null,则可能意味着没有相关实体(如果已设置HasRequired,则为无效情况),或者相关实体尚未加载。要确保相关属性是否已真正设置,必须再次访问数据库。这代价很高,并且可能会导致将数据库的一半加载到内存中—这是您永远无法避免的情况。2)否。将外键设置为值并不一定正确。如果没有具有外键设置值的实体,该怎么办?此外,EF中的验证仅基于属性和面验证值。它没有任何特定的逻辑来对2个或更多属性进行交叉检查。已经说过(1和2)-EF中的验证是可扩展的-您可以使用CustomValidationAttribute、自定义属性(从ValidationAttribute类派生的属性)或IValidatableObject来使用您自己的自定义规则扩展内置验证,它将正常工作。嗨,Pawel,看来你不明白我想说什么。案例:映射已在引用属性上设置必需的。我的观点是,EF可以对引用(=NULL)和零值ReferenceId(=0)进行基本检查,知道引用具有无效值,而无需进入数据库,并引发FK冲突异常。我不是说EF应该知道我是否设置了正确的值,我是说EF应该知道NULL在任何情况下都是不正确的值。我不理解为什么ReferenceId==0是无效的值-对我来说,它和任何其他键值一样好。键不必自动生成,即使是,也不必从1开始。因此,您提出的逻辑并不适用于所有模型。为了避免虚假的验证错误(以及对数据库的额外访问),EF不验证导航属性。同样,EF不会交叉检查多个属性。如果像您建议的验证规则对您有效,您可以实现它,EF将使用它。
this.HasRequired(t => t.Unit)
    .WithMany(t => t.Machines)
    .HasForeignKey(d => d.UnitId);