我是新的与实体框架的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()),甚至不尝试插入记录。 –