避免在Entity Framework中插入重复记录

时间:2014-03-24 09:35:01

标签: entity-framework concurrency sqlexception

我有一个典型的场景,用户输入使用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;
}

是否有"清洁剂"实现相同的方法,不涉及查看错误消息字符串?

1 个答案:

答案 0 :(得分:0)

您可能希望享受AddOrUpdate方法。 首先研究它。我注意到专家警告过度使用。

  Context.Set<TPoco>().AddOrUpdate(poco);

仍然可以抛出其他EF \ DB异常。 但Duplicate primary key 应该是其中之一。 其他约束问题与以前一样。