我正在使用存儲庫模式。實體框架:如何在提交之前檢查值是否存在
我有我使用一個服務提交國家資料庫。我應該在哪裏查看該國是否已經存在於數據庫中,我拋出異常?
有沒有辦法在一個數據庫調用做到這一點? (如果不存在,請檢查並插入)?如果這是可能的,是否可以在服務層完成? (如果這是你推薦的地方,我會進行檢查)。
我正在使用存儲庫模式。實體框架:如何在提交之前檢查值是否存在
我有我使用一個服務提交國家資料庫。我應該在哪裏查看該國是否已經存在於數據庫中,我拋出異常?
有沒有辦法在一個數據庫調用做到這一點? (如果不存在,請檢查並插入)?如果這是可能的,是否可以在服務層完成? (如果這是你推薦的地方,我會進行檢查)。
由於多用戶併發的,你不能SELECT
然後INSERT
和得到保證沒有問題。因此,由@Coding Gorilla提出的解決方案可能在高併發情況下失敗。
你應該把一個UNIQUE
指數在適當的DB列和處理(或讓表面)數據庫異常,如果國家不存在,你會得到。是的,你可以在服務層做到這一點。這只是一個數據庫調用,並且不會失敗,因爲數據庫服務器可以保護您免受併發問題的困擾。
是否把這種邏輯在您的服務或您的資料庫是有點主觀的問題。就我個人而言,如果它不存在,我會進行服務檢查並插入,但在嘗試執行插入操作之前,也會讓您的存儲庫驗證它不存在,這樣,您的存儲庫正在執行一些「邏輯」來防止數據庫從充斥着愚蠢。
怎麼辦?
public void InsertIfNonExistant(string Country)
{
if(!_myContext.Countries.Any(c=>c.Name == Country))
InsertNewCountry(Country);
}
你是說讓EF拋出錯誤,只是在服務層中調用Insert?我不必寫任何支票? – 2010-12-17 18:49:53
如果違反'UNIQUE'約束,數據庫服務器將返回錯誤。當這種情況發生時,EF將會拋出。 – 2010-12-17 18:57:35