当 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 不是一个选项(除非我只添加行计数标识列)。
如果没有主键,则不会发出两个接口:INotifyPropertyChanging
和 INotifyPropertyChanged
,因此 LINQ to SQL 不知道您的记录已更改。执行以下操作:
- 打开 LINQ 设计器。
- 打开要从中删除记录的 table 的属性 window。
- 单击您要删除的实体中的任何列,您将看到标有 "Primary Key" 的 属性。
- 将要用作主键的列的值更改为 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();
我正在尝试从没有主键的数据库中删除记录。以下作品:
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 不是一个选项(除非我只添加行计数标识列)。
如果没有主键,则不会发出两个接口:INotifyPropertyChanging
和 INotifyPropertyChanged
,因此 LINQ to SQL 不知道您的记录已更改。执行以下操作:
- 打开 LINQ 设计器。
- 打开要从中删除记录的 table 的属性 window。
- 单击您要删除的实体中的任何列,您将看到标有 "Primary Key" 的 属性。
- 将要用作主键的列的值更改为 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();