【发布时间】:2012-08-06 18:31:42
【问题描述】:
我有一个带有 PK 列 ItemID 和列 Value 上的唯一索引的 sql 表。
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”中插入重复的键行。
声明已终止。
如何避免这种情况?
编辑:我不能做单次插入,所以我不能在 for 循环内移动 db.SubmitChanges() 调用。
EDIT2:到目前为止发布的答案涉及修复数据而不是 linq-sql 中的方法。我已经举了一个带有整数列表的简单示例。但实际上我有一个要插入的对象图列表,每个项目都会命中多个表以进行插入/更新。我找到了一种使用 linq DataContext's ChangeSet(DataContext.GetChangeSet().Deletes、DataContext.GetChangeSet().Inserts 等)的方法,我已将其作为答案发布。
【问题讨论】:
标签: c# linq-to-sql unique-index