我有一个典型的场景,用户输入使用Entity Framework 6.0插入SQL数据库的数据。但是,作为实体一部分的某些行必须是唯一的(已在数据库中使用唯一键约束强制执行)。
为了避免可能的并发或性能问题,我赞成由SQL Server完成这些检查。
尝试保存包含重复行的新实体时,Entity Framework会抛出DbUpdateException。内部异常是一个SqlException,其Number等于2627,并显示一条消息:
"违反UNIQUE KEY约束' UK_MyTable_MyRule'。无法在对象中插入重复键' dbo.MyTable'"。
考虑到涉及多个表,每个表都有自己定义的唯一约束,没有更好的方法可以向用户提供更友好的消息:
"一个名为' MyEntity1'的MyEntity已经存在。"
...而不必通过SqlException中的Number和Message属性来推断它?
例如:
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;
}
是否有"清洁剂"实现相同的方法,不涉及查看错误消息字符串?
答案 0 :(得分:0)
您可能希望享受AddOrUpdate方法。 首先研究它。我注意到专家警告过度使用。
Context.Set<TPoco>().AddOrUpdate(poco);
仍然可以抛出其他EF \ DB异常。
但Duplicate primary key
不应该是其中之一。
其他约束问题与以前一样。