当 table 没有主键时使用 DeleteAllOnSubmit

Using DeleteAllOnSubmit when the table has no primary key

我正在尝试从没有主键的数据库中删除记录。以下作品:

using (myDataContext db = new myDataContext ())
{
    db.ExecuteCommand("DELETE FROM myTable WHERE TradeDate = {0}", date);
}

(其中 date 是函数的输入)。但是当我尝试将它转换为 LINQ

using (myDataContext db = new myDataContext ())
{
    db.myTable.DeleteAllOnSubmit(db.myTable.Where(t => t.TradeDate.Date == date.Date));
    db.SubmitChanges();
}

我收到以下错误,因为 table 没有主键:

Additional information: Can't perform Create, Update, or Delete operations on 'Table(myTable)' because it has no primary key.

我找到了以下有关此问题的旧帖子

DB:4.44:Dml Operations Using Linq Query For A Table Without Primary Key zm

Dml Operations using linq query for a table without primary key.

但我不明白如何实施他们建议的修复(即将另一个键设置为 IsPrimary)。

有没有办法使用 LINQ 来做到这一点?请记住,将 PK 添加到实际 SQL table 不是一个选项(除非我只添加行计数标识列)。

如果没有主键,则不会发出两个接口:INotifyPropertyChangingINotifyPropertyChanged,因此 LINQ to SQL 不知道您的记录已更改。执行以下操作:

  1. 打开 LINQ 设计器。
  2. 打开要从中删除记录的 table 的属性 window。
  3. 单击您要删除的实体中的任何列,您将看到标有 "Primary Key" 的 属性。
  4. 将要用作主键的列的值更改为 true。

请使用唯一列作为 EF 模型中的主键。

否则使用DataContext.ExecuteCommand()

正如其他人所指出的,您需要向 table 添加一个主键。然后执行查询。

否则您可以尝试像这样手动删除该行:

var query = myTable.AsEnumerable().Where(r => r.Field<Date>("TradeDate") == date.Date);

foreach(var row in query.ToList())
   row.Delete();