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