1

我有一个要输入数据库的对象数组。我的方法调用看起来像这样。

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. 我应该写一些存储过程来提高性能吗?
4

3 回答 3

1

我同意你应该让分贝做出决定。请查看使用UPSERT,如本文所述

于 2012-06-01T09:36:14.510 回答
0

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

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

于 2012-06-01T08:38:36.693 回答
0

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

于 2012-06-01T07:42:42.740 回答