2016-02-16 27 views
1

假設我有一個包含PK列的表,其他一些列和一個必須是唯一的表。獨特列,檢查現有記錄,最佳方法

哪種方法更好地處理新記錄添加了已存在的唯一密鑰的可能性?

查詢db例如

if (!_db.MyTable.Any(mt => mt.UniqueCode == newRecord.UniqueCode)) 
    _db.MyTable.Add(newRecord); 
else //handle response 

或嘗試添加它而不檢查和處理錯誤?例如

try 
} 
    _db.MyTable.Add(newRecord); 
} 
catch (Exception e) 
{ 
    //handle response 
} 

在第一種方法中,我看到的缺點是需要2次調用db。 (我離開了_db.SaveChanges()),但我總覺得避免例外情況會更好。怎麼樣?哪一個對性能更好?有沒有更好的辦法?

+2

我取認爲在應用程序中執行異常處理要比第二次往返數據庫更好。考慮到對數據庫的調用涉及到什麼(從EF內部到DB內部和通信),異常處理聽起來不那麼糟糕。但我認爲應該做一個績效評估來證明哪一個最好。 –

回答

3

第二種方法要好得多,因爲第一種方法不能保證在多線程環境中工作。檢查和插入之間可能會添加新記錄,導致重複記錄或異常。

通常,最好讓數據庫在可以時驗證數據。即使在應用程序層可能很難編碼的複雜場景中,數據庫引擎也能保證唯一性。

1

通常情況下,最好避免部分工作解決方案依賴於「捕獲所有異常情況」。如果可能的話,最好避免它,所以通常你應該堅持先查詢數據庫。

你可以想出情況,事先檢查不是首選。在這種情況下,您應該首先處理您預期的特定異常情況,這會讓您「自由地」處理任何意外的異常情況。你必須評估這是否是這種情況。

如果是。那麼你的情況,你可以處理「違反唯一約束」的例外是這樣的:

try 
{ 
    _db.MyTable.Add(newRecord); 
} 
catch (SqlException ex) 
{ 
    if (ex.Number == 2627) 
    { 
    // Handle unique constraint violation. 
    } 
    else 
    { 
    // Handle the remaing SQL errors. 
    } 
} 
catch (Exception e) 
{ 
    // Handle any other non-SQL exceptions 
} 

對於可能出現的例外列表中相應的ID,您可以運行此查詢:

SELECT * FROM sys.messages 
WHERE text like '%duplicate%' and text like '%key%' and language_id = 1033 

查詢從Unique Key Violation in SQL Server