c# - Linq DELETE 在 SQL Server 中生成 UPDATE 查询

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

我有数据库模型:enter image description here

CONSTRAINT [FK_applications_orders] FOREIGN KEY ([order_id]) REFERENCES [dbo].[orders] ([order_id])

和 Controller Action :

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 查询?

最佳答案

您在订单和应用程序之间有 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

关于c# - Linq DELETE 在 SQL Server 中生成 UPDATE 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44693476/

相关文章:

sql-server - Azure 数据工厂中的 CDC 支持

C# SQL INSERT 未出现在数据库表 "no errors or exceptions thrown"中

c# - 如何将值从 Controller 传递到 asp.net 中查看?

asp.net-mvc - System.Web.HttpRequestBase 不包含 'CreateResponse' 的定义

c# - 可以从 JavaScript 调用 C# 函数吗?

C#秒表类

php - 插入排名的最佳方式(带有php的SQL数据库)

asp.net - Azure Web 角色 - 最大出站 http 连接数

c# - 以编程方式在 Firefox 中自动化鼠标移动和点击

c# - 将 LINQ 查询结果用于 GridControl c# 的数据源