2012-03-02 150 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配置,儘管在所有情況下表示的模型,關係和數據庫模式都是相同的。