最佳实践在插入项目列表之前检查重复的行

时间:2012-06-01 07:36:38

标签: 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 = 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
  1. 那么,我怎么能更优雅地处理这个呢?
  2. 使用linq是否值得尝试完成此操作?
  3. 我应该为性能编写一些存储过程吗?

3 个答案:

答案 0 :(得分:1)

我同意你应该让db做出决定。 请按照UPSERT

中的说明使用this post

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

如果您主要关注的是性能使用存储过程,您可以在初始检查存在时另外使用表提示来锁定表插入。