經過大量研究,似乎Entity Framework 4.4不支持唯一約束。是的,它可以&應該在數據庫中完成,但我更喜歡它發生在模型驗證,所以用戶的警告更漂亮。Entity Framework中唯一字段的選項 - 將屬性導航到dbSet?
這將是理想的程序員可以用[獨特]屬性裝飾的財產,應該有可能以某種方式,例如:
public class UserGroup
{
public int UserGroupID { get; set; }
[Required]
[Unique]
public string Name { get; set; }
[Required]
public string Description { get; set; }
}
選項我考慮:
1)讓存儲庫在SaveChanges()上執行一些額外的工作,在修改的實體上掃描[Unique]屬性並點擊數據庫以檢查唯一性。下行:這種驗證只發生在我們調用SaveChanges()時,理想情況下它可以在更早的時候發生(例如,當UI控件驗證時)。
2)給出的用戶組模型中的延遲加載導航屬性AllUserGroups:
public virtual ICollection<UserGroup> AllUserGroups { get; set; }
然後程序UniqueAttribute {}掃描此屬性,並檢查值等
QUESTION:如何我可以配置實體框架(代碼優先)加載所有記錄到這個「導航屬性」?它似乎只想要一個導航屬性與外鍵等,而我只是想要他們所有。
3)在UI中手動編碼驗證 - 可怕的&絕對最後的手段。
問題:有沒有更好的選擇來通過模型層面的驗證實施唯一約束?
問候, -Brendan
我覺得這是一個很好的問題,但你已經正確地指出EF實際上並不知道其導航屬性的本地表示是否完整,因此它不能預先驗證唯一約束。你有沒有簡單地捕獲和解析SQL異常,併爲用戶產生一個更好的錯誤,而我認爲這會比你提出的要容易得多(這本質上需要緩存數據庫) –
嗨,盧克,我可能會去與(1)(倉庫中的時髦工作),如果沒有人可以建議如何做(2)。是(2)必須擊中數據庫並加載整個表。或者,如果DbSet <>可以在這裏公開,那麼它可以直接查詢。 啊......我們的團隊對POCO課程感到後悔--FEF似乎與超出最簡單的數據庫要求的任何事情相抗衡。 –
我想我所說的是,這兩個選項似乎都非常複雜,而且性能不是很好。我不認爲這兩者都是必需的。當您違反數據庫上的唯一約束時,SQL將拋出一個相當錯誤的描述(在ef的SaveChanges上)。通過在較高級別捕獲此錯誤,您可以解析它並在此階段計算出您想要的任何驗證消息。我不認爲預驗證實際上是你想要下去的路徑,並且這將是我所知道的任何ORM的問題(並且對於這個問題也與原始SQL有關),所以我不認爲這是一個失敗的CodeFirst –