2012-11-11 49 views
0

我從試圖設置布爾值IsVisible的控制器方法中獲取DbEntityValidationException,它從它從數據庫中檢索到的實體。它通過頁面上的複選框更改來響應AJAX帖子。此代碼用於工作。DbEntityValidationException但數據有效 - 如何調試?

var targetClass = db.Classes.FirstOrDefault(x => x.ID == cid); 
targetClass.IsVisible = true; 
db.SaveChanges(); 

這導致DbEntityValidationException與以下錯誤:

The SchoolYear field is required. 
The TuitionPlan field is required. 

當我通過這個代碼步驟都targetClass.SchoolYeartargetClass.TuitionPlan是有效的。

問題是,我該如何找出EF認爲這些字段丟失的原因?

編輯:這可能與(也)懶惰加載......如果我使用兩個「缺少」字段,錯誤消失。也許沒有什麼比不知道爲什麼一個嚴重的問題剛剛離開

var targetClass = db.Classes.FirstOrDefault(x => x.ID == cid); 
targetClass.IsVisible = value; 
int x = targetClass.TuitionPlan.ID; 
x = targetClass.SchoolYear.ID; 
db.SaveChanges(); 

我真的需要有人解釋這裏發生了什麼,以及我將來如何防止這種情況發生。

感謝洞察力, 埃裏克

回答

0

我不認爲這是反對無效驗證導航性能是一個好主意。導航屬性設置爲空意味着沒有相關實體(您想驗證的條件),但也可能意味着相關實體未加載。現在,爲了驗證它而向數據庫發送額外的查詢似乎是矯枉過正,可能會導致性能問題(首先,您可能會向數據庫發送大量查詢,其次(除非您將實體加載爲不存在跟蹤)你開始跟蹤你實際需要跟蹤的更多實體)。另請注意,由於上述原因,驗證在驗證完成之前會禁用延遲加載。這可能是您看到錯誤的原因,即使您的應用程序啓用了延遲加載。在驗證期間,它將被禁用,並且訪問導航屬性將不會加載相關的實體。如果你想驗證一個相關的實體是否存在,你可以使用外鍵。請注意,它不需要加載相關的實體,並且應該相對容易。

+0

總之,我不應該在導航屬性上使用[必需的]註釋。那是對的嗎? –

+0

正確。我不會推薦你這樣做。 – Pawel

+0

缺少'[必須]'我如何刪除級聯? –