Entity framework 避免在实体框架中插入重复记录
我有一个典型的场景,用户使用EntityFramework6.0输入插入SQL数据库的数据。但是,作为实体一部分的某些行需要是唯一的(已经使用数据库中的唯一键约束强制) 为了避免可能的并发性或性能问题,我倾向于让SQL Server完成这些检查 当试图保存包含重复行的新实体时,实体框架会抛出一个DbUpdateException。内部异常是一个编号为2627的SqlException,以及一条如下消息: 违反唯一键约束“UK_MyTable_MyRule”。无法在对象“dbo.MyTable”中插入重复键 考虑到涉及多个表,每个表可能都定义了自己的唯一约束,没有更好的方法向用户总结一条更友好的消息,内容如下: “名为'MyEntity1'的MyEntity已存在。” …而不必通过SqlException中的数字和消息属性来推断这一点 例如:Entity framework 避免在实体框架中插入重复记录,entity-framework,concurrency,sqlexception,Entity Framework,Concurrency,Sqlexception,我有一个典型的场景,用户使用EntityFramework6.0输入插入SQL数据库的数据。但是,作为实体一部分的某些行需要是唯一的(已经使用数据库中的唯一键约束强制) 为了避免可能的并发性或性能问题,我倾向于让SQL Server完成这些检查 当试图保存包含重复行的新实体时,实体框架会抛出一个DbUpdateException。内部异常是一个编号为2627的SqlException,以及一条如下消息: 违反唯一键约束“UK_MyTable_MyRule”。无法在对象“dbo.MyTable”中
try
{
...
context.SaveChanges();
}
catch (DbUpdateException exception)
{
var sqlException = exception.InnerException as SqlException;
bool isDuplicateInMyTable3 =
sqlException != null &&
sqlException.Number = 2627/*Unique Constraint Violation*/ &&
sqlException.Message.Contains("'UK_MyTable3_");
if (isDuplicateInMyTable3)
{
return "A MyTable3 with " + ... + " already exists.";
}
throw exception;
}
是否有一种“更干净”的方法可以实现同样的效果,而不需要查看错误消息字符串?您可能喜欢使用AddOrUpdate方法。 先研究一下。我注意到专家警告过度使用
Context.Set<TPoco>().AddOrUpdate(poco);
Context.Set().AddOrUpdate(poco);
仍然可以引发其他EF\DB异常。
但是重复主键
应该不是其中之一。
其他约束问题与以前一样。从这里开始研究!谢谢,科林,我记得朱莉·L.警告过你。我自己使用它,但只用于关键和完整的更新场景。谢谢phil soady。这似乎是一个巧妙的方法。然而,我似乎找不到关于它的并发性的任何信息。恐怕我不愿意在我的案例中使用它。避免插入重复记录的更常见方法可能不是您首选的技术,但它确实意味着您可以定制您的消息:这也很有趣。谢谢你,科林。