如果我在地圖文件(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作爲驗證規則,而不是屬性。
對於EF來說,檢查引用屬性中是否存在值是不是正常的期望值,如果在Map中我們設置了HasRequired?在這一點上,我們不在乎輸入的值是否正確,我們只關心通知用戶NULL是不可接受的。你在這裏講的是在實體上有Reference和ReferenceId的情況,如果這個對象沒有加載到內存中,我們設置ReferenceId,那麼Reference可以是null。我同意這一點,但如果我們在引用屬性上設置ForeignKey(「ReferenceId」),如果引用包含null,那麼期望EF檢查是否查看ReferenceId是否正常? – Goran
1)否。如果導航屬性爲空,則可能意味着沒有相關實體(如果HasRequired已設置,則該實體無效)或尚未加載相關實體。爲了確保相關屬性是否真的設置,必須再次訪問數據庫。這是昂貴的,可能導致將一半的數據庫加載到內存中 - 這是您永遠不會避免的情況。 – Pawel
2)編號將外鍵設置爲一個值不一定是正確的。如果沒有實體具有您設置外鍵的值,該怎麼辦?此外,EF中的驗證僅基於屬性和構面驗證值。它沒有任何特定邏輯來針對2個或更多屬性進行交叉檢查。 說了(1和2) - EF中的驗證是可擴展的 - 您可以使用CustomValidationAttribute,一個自定義屬性只是工作。 – Pawel