LinqtoSQL - 清除然后插入

时间:2009-07-24 15:08:49

标签: .net linq-to-sql

虽然这可能不是最佳实践,但我试图从数据库表中清除一系列记录,然后插入一系列记录 - 其中一些可能已存在于原始系列中,而其他记录可能是新。我在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。”

2 个答案:

答案 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();
}