微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

EntityFramework 中的数据库表外键未设置为空

如何解决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 举报,一经查实,本站将立刻删除。