当表没有主键时使用DeleteAllOnSubmit

时间:2015-12-28 11:17:06

标签: c# sql-server linq linq-to-sql

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

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(myTable)'执行创建,更新或删除操作,因为它没有主键。

我发现以下有关此问题的旧帖子

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做到这一点?请记住,在实际的SQL表中添加PK不是一种选择(除非我只是添加一行计数标识列)。

3 个答案:

答案 0 :(得分:3)

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

  1. 打开LINQ Designer。
  2. 打开要从中删除记录的表的属性窗口。
  3. 单击要删除的实体中的任何列,您将看到标记为“主键”的属性。
  4. 将要用作主键的列更改为true。

答案 1 :(得分:0)

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

否则使用 DataContext.ExecuteCommand()

答案 2 :(得分:0)

正如其他人指出的那样,您需要为表添加主键。然后执行查询。

否则,您可以尝试手动删除行:

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

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