我有一个带有 PK 列ItemID
和列上的唯一索引的 sql 表Value
。
CREATE TABLE [dbo].[Item](
[ItemID] [int] IDENTITY(1,1) NOT NULL,
[Value] [int] NULL
)
CREATE UNIQUE NONCLUSTERED INDEX [IDX_Item_Value_U_NC] ON [dbo].[Item]
(
[Value] ASC
)
我正在使用 linq-sql 在表中插入多条记录(批量插入/更新)。在插入记录之前,我会进行“存在”检查。
void MultipleInserts(List<int> values)
{
using (var db = new DBDataContext())
{
foreach (var value in values)
{
var dbItem = db.Items
.Where(x => x.Value == value)
.SingleOrDefault();
if (dbItem == null)
{
var Item = new Item()
{
Value = value
};
db.Items.InsertOnSubmit(Item);
}
}
db.SubmitChanges();
}
}
如果列表具有相同的值,由于唯一索引,我得到以下异常。Item
表没有记录。
var values = new List<int>();
values.Add(1);
values.Add(1);
MultipleInserts(values);
异常消息:
无法在具有唯一索引“IDX_Item_Value_U_NC”的对象“dbo.Item”中插入重复的键行。
该语句已终止。
我该如何避免这种情况?
编辑:我不能做单次插入,所以我不能db.SubmitChanges()
在 for 循环内移动调用。
EDIT2:到目前为止发布的答案涉及修复数据而不是 linq-sql 中的方法。我已经举了一个带有整数列表的简单示例。但实际上我有一个要插入的对象图列表,每个项目都会命中多个表以进行插入/更新。我找到了一种使用 linq (,等)的方法,我已将其发布为答案DataContext
。ChangeSet
DataContext.GetChangeSet().Deletes
DataContext.GetChangeSet().Inserts