2012-09-18 121 views
0

如果我在地圖文件(1到許多單位和機器之間的關係)接下來的定義:EF 4.1 CodeFirst GetValidationErrors

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

當我添加新的實體,Machine.UnitOfMeasurement = NULL,SP爲什麼調用GetValidationErrors時,DbContext返回無驗證問題,我能做些什麼來檢測它們。如果我允許EF嘗試更新,它將向用戶返回無意義的消息,例如外鍵引用錯誤,同時我可以從DbEntityValidationResult(ex屬性名稱發出驗證錯誤)中提取有意義的信息給用戶。

我使用IDataErrorInfo作爲驗證規則,而不是屬性。

回答

1

EF驗證不驗證導航屬性。原因在於導航屬性可能爲空,不是因爲相關實體不存在,而是因爲啓用了延遲加載並且相關實體未加載。此外,即使導航屬性爲空,您可能已設置相應的外鍵屬性,這基本意味着存在關係,但導航屬性尚未更新。還要注意,強制加載相關實體意味着驗證會將整個數據庫帶入內存(在加載相關實體之後,它們將被驗證,導致加載新加載實體的相關實體的內容等) - 您不希望發生這種情況(EF實際上在驗證過程中關閉了延遲加載,以防止這種情況發生)。 EF驗證不支持IDataErrorInfo - 僅驗證屬性和IValidatableObject。

+0

對於EF來說,檢查引用屬性中是否存在值是不是正常的期望值,如果在Map中我們設置了HasRequired?在這一點上,我們不在乎輸入的值是否正確,我們只關心通知用戶NULL是不可接受的。你在這裏講的是在實體上有Reference和ReferenceId的情況,如果這個對象沒有加載到內存中,我們設置ReferenceId,那麼Reference可以是null。我同意這一點,但如果我們在引用屬性上設置ForeignKey(「ReferenceId」),如果引用包含null,那麼期望EF檢查是否查看ReferenceId是否正常? – Goran

+0

1)否。如果導航屬性爲空,則可能意味着沒有相關實體(如果HasRequired已設置,則該實體無效)或尚未加載相關實體。爲了確保相關屬性是否真的設置,必須再次訪問數據庫。這是昂貴的,可能導致將一半的數據庫加載到內存中 - 這是您永遠不會避免的情況。 – Pawel

+0

2)編號將外鍵設置爲一個值不一定是正確的。如果沒有實體具有您設置外鍵的值,該怎麼辦?此外,EF中的驗證僅基於屬性和構面驗證值。它沒有任何特定邏輯來針對2個或更多屬性進行交叉檢查。 說了(1和2) - EF中的驗證是可擴展的 - 您可以使用CustomValidationAttribute,一個自定義屬性只是工作。 – Pawel