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
为什么不尝试插入并让数据库告诉您是否发生了任何唯一约束冲突(使用try/catch)?为什么不尝试插入并让数据库告诉您是否发生了任何唯一约束冲突(使用try/catch)问题是,即使您查询数据,其他人也可以在您的查询和保存更改之间插入记录。尽管有额外的查询,您仍然必须处理违反唯一约束的异常——是的,每次检查都会对数据库进行额外的访问
如果您主要关心的是性能,请使用存储过程,在初始检查是否存在时,您还可以使用表提示锁定表以进行插入。问题是,即使您查询数据,其他人也可以在您的查询和保存更改之间插入记录。尽管有额外的查询,您仍然必须处理违反唯一约束的异常——是的,每次检查都会对数据库进行额外的访问
如果您主要关心的是性能,请使用存储过程,在初始检查是否存在的过程中,您还可以使用表提示锁定表以进行插入。我同意您应该让db做出决定。
请看一看中所述的使用。我同意您应该让争议裁决委员会做出决定。
请看一看使用说明,如中所述,这就是我正在做的。依赖异常处理似乎是不对的。这就是我正在做的。依赖异常处理似乎是不对的。