虽然这可能不是最佳实践,但我试图从数据库表中清除一系列记录,然后插入一系列记录 - 其中一些可能已存在于原始系列中,而其他记录可能是新。我在C#中使用linqtosql。我必须这样做的伪代码如下;它失败了“无法添加一个已经在使用的密钥的实体。”
using (dbDataContext context = new dbDataContext()
{
// I've also tried using table.LinkedTable.Clear(); but that shows the same error
while (table.LinkedTable.Count() > 0)
{
table.LinkedTable.RemoveAt(0);
}
foreach (ListItem item in SelectedItems.Items)
{
LinkedTable lt = new LinkedTable();
lt.id = table.id;
lt.SomeValue = item.SelectedValue;
table.LinedTable.Add(lt);
}
context.SubmitChanges();
}
似乎linqtosql没有注意到我在尝试添加项目之前删除了项目,导致重复错误。有没有人有任何建议要纠正这个?
修改 如果我在删除后添加SubmitChanges,那么我最终会收到此消息。
“试图删除表和LinkedTable之间的关系。但是,其中一个关系的外键(LinkedTable.Id)不能设置为null。”
答案 0 :(得分:2)
您可以尝试使用ITable.DeleteAllOnSubmit方法:
using (dbDataContext context = new dbDataContext()
{
// table.LinkedTable is a EntitySet of LinkedTable objects,
// we remove from the "LinkedTable" table, the records that
// are related to the "table" object:
context.LinkedTable.DeleteAllOnSubmit(table.LinkedTable);
foreach (ListItem item in SelectedItems.Items)
{
LinkedTable lt = new LinkedTable();
lt.id = table.id;
lt.SomeValue = item.SelectedValue;
table.LinedTable.Add(lt);
}
context.SubmitChanges();
}
答案 1 :(得分:0)
在删除您不想要的记录后,您似乎错过了对.SubmitChanges()的调用。
例如(使用伪代码):
using (dbDataContext context = new dbDataContext()
{
// I've also tried using table.LinkedTable.Clear(); but that shows the same error
while (table.LinkedTable.Count() > 0)
{
table.LinkedTable.RemoveAt(0);
}
context.SubmitChanges(); // Submit the "removal" of records HERE!!!
foreach (ListItem item in SelectedItems.Items)
{
LinkedTable lt = new LinkedTable();
lt.id = table.id;
lt.SomeValue = item.SelectedValue;
table.LinedTable.Add(lt);
}
context.SubmitChanges();
}