c# - EntityFramework 中的数据库表外键未设置为 null
问题描述
我有一个使用 EntityFramework 6 的应用程序。
在应用程序的某些部分,我正在以这种方式更改实体外部数据:
trabajador.Departamento = departamentoId == 0 ? null : await db.Departamento.FindAsync(departamentoId);
其中Departamento
属性是对应于实体的相关实体的对象trabajador
。
看看那个三元运算符。
如果departamentoId
变量为 0,我需要删除关系,以便分配null
给相关实体(将 DB 表中的基础外键设置为 NULL)。如果departamentoId
有一些数字(相关的实体 id),我会执行一个FindAsync
来分配新对象。
Departamento
当其他实体更改Departamento
实体时,它可以工作。但是,在分配时null
,基础表字段未设置为 NULL。
另一方面,如果我将该分配更改为:
trabajador.DepartamentoId = departamentoId == 0 ? (int?)null : departamentoId;
trabajador.DepartamentoId
EF 创建的外键属性在哪里。这完美无缺。我可以更改外键,甚至可以将该外键设置为空,因为它可以为空。
为什么在分配外键属性时有效,但在分配对象实体时无效?
谢谢詹姆
解决方案
可能的罪魁祸首是在加载要更新的父对象时没有预先加载关联实体。
IE
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 不构成更改跟踪的更改。
推荐阅读
- python - 从 API 下载文件
- php - 无法确定属性“属性”的访问类型
- amazon-web-services - 当我在不同帐户中从 Codepipeline 调用 lambda 函数时出现 JobNotFoundException
- c# - 将“窗口”保存为 pdf
- arrays - 从多维数组中删除重复项
- eclipse - 在 spring 中使用 @Scheduled 会导致 java.net.BindException: Address already in use: bind
- javascript - 在父级执行 onclick 无意中设置 onclick 父级结果 Javascript
- javascript - Three.js - 动态“构建/绘制” TextGeometry
- mongodb - 对mongodb中的对象ID数组执行$lookup?
- php - 在 laravel 中获取所有类别级别的产品