2012-03-02 114 views
0

我一直遇到的一个实体框架'gotcha'是关闭了延迟加载以进行验证。因此,如果我使用db.Find()加载实体,然后更新它并尝试调用db.SaveChanges()(db是DBContext对象),如果实体具有任何标记为[必需]的相关实体,则会引发错误。对实体框架中所需相关实体的验证

在我看来有三种方式来处理这个问题 - 1.没有标注相关的实体[必需]和手动确保已到达 2.使用包括创建的时间()加载实体时包括相关实体 3.执行自定义验证。

由于其简单性,我倾向于使用(1)。

用户是否有任何建议或模式用于此场景?

回答

1

有两个更多的选择:

  • 定义的关系在流利的API要求,而不是使用[Required]属性:

    modelBuilder.Entity<Order>() 
        .HasRequired(o => o.Customer); 
    
  • 暴露在非空的外键的模型,那么您不需要[Required]属性(并且既不使用Fluent API进行映射),因为惯例会检测到需要该关系:

    public class Order 
    { 
        //... 
        public int CustomerId { get; set; } 
        public Customer Customer { get; set; } 
        //... 
    } 
    

老实说,我不知道它为什么起作用。看起来在这种情况下,由于某种原因,EF验证只检查数据注释,而不检查Fluent配置,尽管在所有情况下表示的模型,关系和数据库模式都是相同的。