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
Linq 插入项目列表前检查重复行的最佳做法_Linq_Entity Framework_Insert_Unique Constraint - Fatal编程技术网

Linq 插入项目列表前检查重复行的最佳做法

Linq 插入项目列表前检查重复行的最佳做法,linq,entity-framework,insert,unique-constraint,Linq,Entity Framework,Insert,Unique Constraint,我有一个要输入数据库的对象数组。 我的方法调用如下所示 public void Add(CardElement[] cardElements){ foreach (var cardElement in cardElements) { Data.Entry(cardElement).State = System.Data.EntityState.Added; } Data.SaveChanges(); } 数据库表与此类似 MS SQL = Tab

我有一个要输入数据库的对象数组。 我的方法调用如下所示

public void Add(CardElement[] cardElements){
    foreach (var cardElement in cardElements)
    {
        Data.Entry(cardElement).State = System.Data.EntityState.Added;
    }
    Data.SaveChanges();
}
数据库表与此类似

MS SQL = Table mytable Columns a,b,c,d,e,f
Unique Constraint a,b,c 
我要插入的数据与此类似

var obj []  = new [] { 
   new MyObject () { a = 1, b =1, c = 1 },
   new MyObject () { a = 1, b =1, c = 2 }
   new MyObject () { a = 1, b =1, c = 3 }
 };
因此,我想在将这三行添加到数据库之前检查数据库中的这三行

private bool checkExists()...

foreach (var cardElement in cardElements)
{
    var exists = (from ce in Data.CardElements
                    where ce.CardId == cardElement.CardId
                    where ce.Area == cardElement.Area
                    where ce.ElementName == cardElement.ElementName
                    select ce).Any();
    if(exists return true)
}
return false
我可以做一些类似的事情,但我认为这会导致对数据库的额外访问

private bool checkExists()...

foreach (var cardElement in cardElements)
{
    var exists = (from ce in Data.CardElements
                    where ce.CardId == cardElement.CardId
                    where ce.Area == cardElement.Area
                    where ce.ElementName == cardElement.ElementName
                    select ce).Any();
    if(exists return true)
}
return false
  • 那么,我怎样才能更优雅地处理这件事呢
  • 甚至值得尝试使用linq来实现这一点吗
  • 我应该编写一些存储过程来提高性能吗

  • 为什么不尝试插入并让数据库告诉您是否发生了任何唯一约束冲突(使用try/catch)?

    为什么不尝试插入并让数据库告诉您是否发生了任何唯一约束冲突(使用try/catch)问题是,即使您查询数据,其他人也可以在您的查询和保存更改之间插入记录。尽管有额外的查询,您仍然必须处理违反唯一约束的异常——是的,每次检查都会对数据库进行额外的访问


    如果您主要关心的是性能,请使用存储过程,在初始检查是否存在时,您还可以使用表提示锁定表以进行插入。

    问题是,即使您查询数据,其他人也可以在您的查询和保存更改之间插入记录。尽管有额外的查询,您仍然必须处理违反唯一约束的异常——是的,每次检查都会对数据库进行额外的访问


    如果您主要关心的是性能,请使用存储过程,在初始检查是否存在的过程中,您还可以使用表提示锁定表以进行插入。

    我同意您应该让db做出决定。
    请看一看

    中所述的使用。我同意您应该让争议裁决委员会做出决定。
    请看一看使用说明,如

    中所述,这就是我正在做的。依赖异常处理似乎是不对的。这就是我正在做的。依赖异常处理似乎是不对的。