Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 避免在实体框架中插入重复记录_Entity Framework_Concurrency_Sqlexception - Fatal编程技术网

Entity framework 避免在实体框架中插入重复记录

Entity framework 避免在实体框架中插入重复记录,entity-framework,concurrency,sqlexception,Entity Framework,Concurrency,Sqlexception,我有一个典型的场景,用户使用EntityFramework6.0输入插入SQL数据库的数据。但是,作为实体一部分的某些行需要是唯一的(已经使用数据库中的唯一键约束强制) 为了避免可能的并发性或性能问题,我倾向于让SQL Server完成这些检查 当试图保存包含重复行的新实体时,实体框架会抛出一个DbUpdateException。内部异常是一个编号为2627的SqlException,以及一条如下消息: 违反唯一键约束“UK_MyTable_MyRule”。无法在对象“dbo.MyTable”中

我有一个典型的场景,用户使用EntityFramework6.0输入插入SQL数据库的数据。但是,作为实体一部分的某些行需要是唯一的(已经使用数据库中的唯一键约束强制)

为了避免可能的并发性或性能问题,我倾向于让SQL Server完成这些检查

当试图保存包含重复行的新实体时,实体框架会抛出一个DbUpdateException。内部异常是一个编号为2627的SqlException,以及一条如下消息:

违反唯一键约束“UK_MyTable_MyRule”。无法在对象“dbo.MyTable”中插入重复键

考虑到涉及多个表,每个表可能都定义了自己的唯一约束,没有更好的方法向用户总结一条更友好的消息,内容如下:

“名为'MyEntity1'的MyEntity已存在。”

…而不必通过SqlException中的数字和消息属性来推断这一点

例如:

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。这似乎是一个巧妙的方法。然而,我似乎找不到关于它的并发性的任何信息。恐怕我不愿意在我的案例中使用它。避免插入重复记录的更常见方法可能不是您首选的技术,但它确实意味着您可以定制您的消息:这也很有趣。谢谢你,科林。