0

我使用實體框架4.0來訪問具有唯一列約束的表中的數據。如果違反約束條件,我按照預期調用SaveChanges()時發生異常。我的問題是我是否應該允許將例外拋在首位。我也可以做一個選擇,以避免插入重複的數據(我認爲一個交易是必要的)。使用實體框架時處理唯一約束的最佳方法

在這種情況下,普遍接受的最佳實踐是什麼?

回答

3

避免異常通常是一個好主意 - 拋出異常是一個相當複雜且耗時且耗費資源的操作。所以,如果你可以輕鬆地檢查一個唯一的鍵值是否已經存在,那麼我可能會這樣做。假設您在數據庫級別對該列具有唯一索引或唯一約束,那麼(至少對於SQL Server而言)在該列上已經有一個索引,因此檢查特定值會相當簡單,並且不會有巨大的性能影響。

另一個問題是:您認爲這會發生多久?一天一次?每兩週一次?一分鐘幾次?如果這種情況發生的很少 - 一旦發生在藍色的月亮中 - 我不會首先檢查 - 在這種情況下,讓異常發生並處理它。

所以我想這實際上是首先檢查的費用是多少,以及發生的頻率如何?如果你可以很容易地檢查它 - >一定要這樣做!但是,如果這是一個相當複雜的操作來檢查,而且它很少發生,那麼就處理這個異常。

+0

感謝您的常識答案;這幾乎是我的想法。由於在這種情況下違反約束條件很少見,所以我會保持原樣。 – 2010-10-31 20:16:28

+2

嗯...我不能同意。拋出一個異常*不像查詢數據庫那樣昂貴。也就是說,應該在插入/更新操作之前查詢數據庫,這可能導致違反唯一約束。 – CodeMonkeyKing 2011-03-09 23:05:31

+3

@CodeMonkeyKing就是這一點。如果您在插入數據庫之前查詢數據庫,您將始終有額外的往返處罰,即使如此,插入可能會在您的查詢之間發生並使第一個數據無效。就像Marc說的那樣,檢查你的系統中這種類型的異常是否罕見,如果是這樣,就讓數據庫處理它。 – andrecarlucci 2012-02-14 01:08:59