2013-01-16 27 views
3

經過大量研究,似乎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

+0

我覺得這是一個很好的問題,但你已經正確地指出EF實際上並不知道其導航屬性的本地表示是否完整,因此它不能預先驗證唯一約束。你有沒有簡單地捕獲和解析SQL異常,併爲用戶產生一個更好的錯誤,而我認爲這會比你提出的要容易得多(這本質上需要緩存數據庫) –

+0

嗨,盧克,我可能會去與(1)(倉庫中的時髦工作),如果沒有人可以建議如何做(2)。是(2)必須擊中數據庫並加載整個表。或者,如果DbSet <>可以在這裏公開,那麼它可以直接查詢。 啊......我們的團隊對POCO課程感到後悔--FEF似乎與超出最簡單的數據庫要求的任何事情相抗衡。 –

+0

我想我所說的是,這兩個選項似乎都非常複雜,而且性能不是很好。我不認爲這兩者都是必需的。當您違反數據庫上的唯一約束時,SQL將拋出一個相當錯誤的描述(在ef的SaveChanges上)。通過在較高級別捕獲此錯誤,您可以解析它並在此階段計算出您想要的任何驗證消息。我不認爲預驗證實際上是你想要下去的路徑,並且這將是我所知道的任何ORM的問題(並且對於這個問題也與原始SQL有關),所以我不認爲這是一個失敗的CodeFirst –

回答

3
+0

非常令人印象深刻,似乎實施(2) - 我會給它一個去。 –

+0

@BrendanHill謝謝你的補充,歡迎來到SO,在這裏,upvote是你得到的最好補充...再次感謝tho,很高興它幫助:) – Shimmy

+0

完美的想法。我只是建議你是否使用DI來注入DbContext而不是創建一個新的。 –

相關問題