首页 > 解决方案 > 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.DepartamentoIdEF 创建的外键属性在哪里。这完美无缺。我可以更改外键,甚至可以将该外键设置为空,因为它可以为空。

为什么在分配外键属性时有效,但在分配对象实体时无效?

谢谢詹姆

标签: c#entity-frameworkentity-framework-6

解决方案


可能的罪魁祸首是在加载要更新的父对象时没有预先加载关联实体。

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 不构成更改跟踪的更改。


推荐阅读