0

我是新的與實體框架的Asp.net MVC 3。Asp.Net MVC 3防止重複記錄

我按照教程做了一個簡單的程序,用於添加/編輯和刪除SQL數據庫中的記錄。

我的問題是如何以及在哪裏我必須防止重複記錄?我有「firstName」字段作爲唯一。所以,當用戶從表單中添加一條記錄時,我如何控制這條記錄不存在?

非常感謝提前。

+0

如果你有一個獨特的列,那麼當您嘗試插入一條新記錄時,它會生成一個例外。 –

+0

是的,我如何控制這個異常? – Fabian

+0

如果您不想捕獲異常(!),最好的方法是查詢具有相同FirstName的記錄(使用FirstOrDefault()僅獲取第一個或更好的Count()),甚至不嘗試插入記錄。 –

回答

-2

這裏有一個簡單的例子:

//在這裏標記爲添加

Context.Entry(yourPersonEntity).State = System.Data.EntityState.Added; 

//這裏你返回true或false是插入成功

bool isSaved = Context.SaveChanges() > 0; 

與實體取決於如果isSaved是真或假,你做你想做的。

記錄異常是可取的,但我建議你通過覆蓋你的上下文的SaveChanges()來做到這一點。

也不要使用FirsOrDefault(),因爲它只是返回第一個值,並不保證該值是唯一的。

返回序列的第一個元素,或者如果找不到 元素,則返回默認值。

使用SingleOrDefault(),因爲它執行top(2)查詢,並且如果有多個結果,它將引發異常。

返回序列的唯一元素,或者如果 序列爲空,則返回默認值;如果序列中的一個元素多於 ,則此方法會引發異常。

+0

'FirstOrDefault()!= null'的作用類似於'Count()> 0'或'Any()';因爲它們應用於**查詢**隱含的是,您搜索具有相同(唯一)值的條目(無論如何,我將它寫在評論中......)。爲此使用例外總是一個壞主意(如此陳舊的討論,對吧?)。查詢的最大缺點是它需要額外的一輪到數據庫,但您可以向用戶顯示有關現有記錄的有意義的消息。 –

+0

這就是我想要的,詳細的解釋讓@Fabian瞭解它的含義和好處。 –

+2

:)好吧,如果我不懶惰寫,我寫了一個答案,而不是評論! LOL無論如何,由於併發請求,他還必須捕獲異常。我想在插入之前檢查而不是僅僅捕獲異常是很有意義的,每次你可以給用戶一個好的反饋(「對不起,你不能插入ID爲123的病人,因爲這個ID被分配給有其他名字的人(XYZ )。檢查您輸入的ID或驗證XYZ的ID是否正確「bla bla bla」而不是「抱歉,由於錯誤無法插入新記錄」) –

0

您可以編寫類似以下趕上已知問題與輸入數據,並僅與其中數據從一種不常見的問題的困擾異常結束:

public class PersonController 
{ 
    public ActionResult Add(PersonModel model) 
    { 
     if (ModelState.IsValid /* && check whether model represents valid data */) 
     { 
      try 
      { 
       // create Person record here (this logic might throw exception) 

       return View("AddSuccess"); 
      } 
      catch (Exception exception) 
      { 
       return View("AddError", exception); 
      } 
     } 
     else 
     { 
      ModelState.AddModelErrors("", "description of model error found"); 
     } 

     return View(); 
    } 
} 

有結構這更好的方法代碼,使用稍微更先進的設計模式,但這應該是一個開始。

通常,您希望避免發生異常,因爲通常它比檢查錯誤輸入要慢。

+0

無需在控制器中放置TryCatch塊。應該有「瘦」。只需重寫SaveChanges()並將所有異常記錄在一個地方即可。 –

+2

在這種情況下,try-catch允許控制器顯示不同的視圖。控制者應該很瘦,但也不需要讓他們成爲單線隊員。 –

+0

如上所述,使用EF可以在一個地方記錄異常。並根據結果顯示消息或重定向。當你不需要時,爲什麼在每個控制器中重複TryCatch。 –

0
if(ModelState.IsValid) 
{ 
    if(db.A.Any(ac=>ac.Name.Equals(a.Name))) 
    { 
      return; 
    } 
    else 
    { 
     db.A.Add(a); 
     db.SaveChange(); 
    } 
} 
0

本教程徹底解釋,以避免在asp.net mvc的重複記錄插入,這裏在本教程中,我們使用的jQuery插件validaton限制重複的用戶名閱讀更多http://www.dotnetqueries.com/Article/137/prevent-duplicate-values-using-jquery-validation

enter image description here

+0

儘管這個鏈接可能回答這個問題,但最好在這裏包含答案的基本部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – aghilpro