【问题标题】:Linq DELETE generates UPDATE query in SQL serverLinq DELETE 在 SQL 服务器中生成 UPDATE 查询
【发布时间】:2017-06-22 07:56:51
【问题描述】:

我有数据库模型:

CONSTRAINT [FK_applications_orders] 外键 ([order_id]) 引用 [dbo].[orders] ([order_id])

和控制器动作:

using (var tx = Database.Database.BeginTransaction())
{
    var order = Database.Set<Order>().Find(someID);

    var apps = Database.Set<Applications>().Where(x => x.Order.Id == order.Id).ToList();
    Database.Delete(order);
    tx.Commit();
}

我打开 SQL 分析器来检查这行 var apps = Database... 生成了什么,然后看看这个:

exec sp_executesql N'UPDATE [dbo].[Applications]
SET [order_id] = NULL
WHERE (([application_id] = @0) AND ([order_id] = @1))
',N'@0 uniqueidentifier,@1 int',@0=SomeId,@1=SomeOtherId

那么为什么 Delete 调用会在 SQL Server 中生成 UPDATE 查询?

【问题讨论】:

  • 如果你把Database.Delete(order);注释掉,还会出现吗?
  • 我认为您删除订单会导致更新应用程序表以强制执行您的约束。
  • @mjwills 如果我注释掉Database.Delete(order)
  • 当然不是……因为语句是Database.Delete引起的
  • 我建议您删除或更新您的问题,因为显然UPDATE 查询不是由 Linq where 子句引起的

标签: c# sql-server asp.net-mvc entity-framework linq


【解决方案1】:

您在 Orders 和 Applications 之间有一个 FK 约束。

当您从 Orders 表中删除时,EF 将对 Applicatoins 表进行更新以强制执行此约束。

例如您有以下表格

订单

order_id
1
2

应用程序

application_id | order_id
     100       |    1
     101       |    2

当你删除一个订单(比如order_id 1)时,如果 EF 没有进行更新,你最终会得到

订单

order_id
2

应用程序

application_id | order_id
     100       |    1  <---- What is this now ???
     101       |    2

所以它正在更新该字段以将其设置为空。

应用程序

application_id | order_id
     100       |    null
     101       |    2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    相关资源
    最近更新 更多