如何解决EntityFramework 中的数据库表外键未设置为空
我有一个使用 EntityFramework 6 的应用程序。
在应用程序的某些部分,我以这种方式更改实体外部数据:
Option Explicit
Sub FilterDates()
Dim date1 As Long,date2 As Long,date3 As Long,x,y
date1 = Sheets("LNG_PORT_23_SG").Range("A2").Value2
date2 = Sheets("LNG_PORT_23_SG").Range("B2").Value2
date3 = Sheets("LNG_PORT_23_SG").Range("E2").Value2
x = Sheets("LNG_PORT_23_SG").Range("C2").Value2
y = Sheets("LNG_PORT_23_SG").Range("C3").Value2
Application.Goto Sheets("LNG_PORTFOLIO_2023_SG_HIST").Range("A1")
With Sheets("LNG_PORTFOLIO_2023_SG_HIST").Range("A1").CurrentRegion
.AutoFilter 1,2,y,7
.AutoFilter 28,">=" & 1 * date1,7
.AutoFilter 29,"<=" & 1 * date2,7
.AutoFilter 9,">=" & 1 * date3,7
.copy Sheets("LNG_PORT_23_SG").Range("A11") '<~~ use this line to copy including headings
'.Offset(1).copy Sheets("LNG_PORT_23_SG").Range("A11") '<~~ OR this line to exclude headings
.AutoFilter
End With
Application.Goto Sheets("LNG_PORT_23_SG").Range("A1")
End Sub
其中 trabajador.Departamento = departamentoId == 0 ? null : await db.Departamento.FindAsync(departamentoId);
property 是一个对象,对应于 Departamento
实体的相关实体。
看看那个三元运算符。
如果 trabajador
变量为 0,我需要删除关系,因此,我将 departamentoId
分配给相关实体(将 DB 表中的基础外键设置为 NULL)。如果 null
有一些数字(相关实体 ID),我会执行 departamentoId
来分配新对象。
当其他 FindAsync
实体更改 Departamento
实体时,它起作用。但是,在分配 Departamento
时,基础表字段未设置为 NULL。
另一方面,如果我将分配更改为:
null
其中 trabajador.DepartamentoId = departamentoId == 0 ? (int?)null : departamentoId;
是 EF 创建的外键属性。这完美地工作。我可以更改外键,甚至可以将该外键设置为 null,因为它可以为 null。
为什么在分配外键属性时有效,而在分配对象实体时无效?
谢谢 詹姆
解决方法
可能的罪魁祸首是在加载父级进行更新时没有预先加载关联实体。
即
var trabajador = context.Trabajadors
.Include(x => x.Departamento)
.Single(x => x.TrabajadorId == trabajadorId);
trabajador.Departamento = departamentoId == 0
? null
: await db.Departamento.FindAsync(departamentoId);
为了能够删除现有关联,您需要确保已预先加载该关联。否则它是#null 并且将其设置为#null 不构成更改跟踪的更改。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。