我是新的與實體框架的Asp.net MVC 3。Asp.Net MVC 3防止重複記錄
我按照教程做了一個簡單的程序,用於添加/編輯和刪除SQL數據庫中的記錄。
我的問題是如何以及在哪裏我必須防止重複記錄?我有「firstName」字段作爲唯一。所以,當用戶從表單中添加一條記錄時,我如何控制這條記錄不存在?
非常感謝提前。
我是新的與實體框架的Asp.net MVC 3。Asp.Net MVC 3防止重複記錄
我按照教程做了一個簡單的程序,用於添加/編輯和刪除SQL數據庫中的記錄。
我的問題是如何以及在哪裏我必須防止重複記錄?我有「firstName」字段作爲唯一。所以,當用戶從表單中添加一條記錄時,我如何控制這條記錄不存在?
非常感謝提前。
這裏有一個簡單的例子:
//在這裏標記爲添加
Context.Entry(yourPersonEntity).State = System.Data.EntityState.Added;
//這裏你返回true或false是插入成功
bool isSaved = Context.SaveChanges() > 0;
與實體取決於如果isSaved是真或假,你做你想做的。
記錄異常是可取的,但我建議你通過覆蓋你的上下文的SaveChanges()
來做到這一點。
也不要使用FirsOrDefault()
,因爲它只是返回第一個值,並不保證該值是唯一的。
返回序列的第一個元素,或者如果找不到 元素,則返回默認值。
使用SingleOrDefault()
,因爲它執行top(2)查詢,並且如果有多個結果,它將引發異常。
返回序列的唯一元素,或者如果 序列爲空,則返回默認值;如果序列中的一個元素多於 ,則此方法會引發異常。
'FirstOrDefault()!= null'的作用類似於'Count()> 0'或'Any()';因爲它們應用於**查詢**隱含的是,您搜索具有相同(唯一)值的條目(無論如何,我將它寫在評論中......)。爲此使用例外總是一個壞主意(如此陳舊的討論,對吧?)。查詢的最大缺點是它需要額外的一輪到數據庫,但您可以向用戶顯示有關現有記錄的有意義的消息。 –
這就是我想要的,詳細的解釋讓@Fabian瞭解它的含義和好處。 –
:)好吧,如果我不懶惰寫,我寫了一個答案,而不是評論! LOL無論如何,由於併發請求,他還必須捕獲異常。我想在插入之前檢查而不是僅僅捕獲異常是很有意義的,每次你可以給用戶一個好的反饋(「對不起,你不能插入ID爲123的病人,因爲這個ID被分配給有其他名字的人(XYZ )。檢查您輸入的ID或驗證XYZ的ID是否正確「bla bla bla」而不是「抱歉,由於錯誤無法插入新記錄」) –
您可以編寫類似以下趕上已知問題與輸入數據,並僅與其中數據從一種不常見的問題的困擾異常結束:
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();
}
}
有結構這更好的方法代碼,使用稍微更先進的設計模式,但這應該是一個開始。
通常,您希望避免發生異常,因爲通常它比檢查錯誤輸入要慢。
無需在控制器中放置TryCatch塊。應該有「瘦」。只需重寫SaveChanges()並將所有異常記錄在一個地方即可。 –
在這種情況下,try-catch允許控制器顯示不同的視圖。控制者應該很瘦,但也不需要讓他們成爲單線隊員。 –
如上所述,使用EF可以在一個地方記錄異常。並根據結果顯示消息或重定向。當你不需要時,爲什麼在每個控制器中重複TryCatch。 –
if(ModelState.IsValid)
{
if(db.A.Any(ac=>ac.Name.Equals(a.Name)))
{
return;
}
else
{
db.A.Add(a);
db.SaveChange();
}
}
本教程徹底解釋,以避免在asp.net mvc的重複記錄插入,這裏在本教程中,我們使用的jQuery插件validaton限制重複的用戶名閱讀更多http://www.dotnetqueries.com/Article/137/prevent-duplicate-values-using-jquery-validation
儘管這個鏈接可能回答這個問題,但最好在這裏包含答案的基本部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – aghilpro
如果你有一個獨特的列,那麼當您嘗試插入一條新記錄時,它會生成一個例外。 –
是的,我如何控制這個異常? – Fabian
如果您不想捕獲異常(!),最好的方法是查詢具有相同FirstName的記錄(使用FirstOrDefault()僅獲取第一個或更好的Count()),甚至不嘗試插入記錄。 –