如何在Entity Framework中将现有属性设置为null值

4

场景:
我有一个实体,其中一个可空的外键Id不再是必需的。

问题:
当我在上下文中更新此实体时,将NULL设置为FK后,在SaveChanges()之后该值未保存到数据库中。

有什么想法吗?

编辑#1:
SaveChanges之后,我检查了基础数据并继续使用旧值,如果我更改为其他值,则正常工作。

类:

public class Account
{
    [Required]
    public int Id { get; set; }

    public int? PlanId { get; set; }

    [Required]
    public virtual Status Status { get; set; }

    #region Navigations Properties

    public virtual Plan Plan { get; set; }

    #endregion
}

用法:(问题)

Account ent = Context.Set<Account>().AsQueryable().FirstOrDefault(x => x.Id = id);
ent.PlanId = null;
Context.SaveChanges();

编辑 [问题已解决]

需要发送一个包含字段的数组,这些字段将获得 null 作为新值。

public virtual void Update(TEntity entityToUpdate, List<string> updateNullFields)
{
    DbSet.Attach(entityToUpdate);
    foreach (var item in updateNullFields)
    {
        Context.Entry(entityToUpdate).Property(item).IsModified = true;
    }
}

1
不保存更改,任何更改都不会影响数据库。 - Mostafiz
1
你刚刚在类中将外键设置为可空,但是没有更改数据库吗? - Eric J.
我会更新帖子以提供更多信息。 - Alexis Diel
这是哪个 EF 版本? - Gert Arnold
EF6,遇到完全相同的问题,不知道为什么。有趣的是,在保存更改之前,如果我在即时窗口中将属性分配为null,则属性会正确设置为null。 - Alexey
1个回答

1
我认为你很可能没有更新数据库本身。 一旦你使用这段代码更新了数据库:
ALTER TABLE [table_name] ALTER COLUMN [fk_column] [datatype] NULL

在.edmx文件上运行“从数据库更新模型”。 在此输入图像描述

确保此处Nullable = true 在此输入图像描述


我正在使用迁移来维护数据库,外键已经是可空的了...问题在于EF在属性有任何非空值后不会将空值持久化到数据库中。 - Alexis Diel
这是在保存或编辑操作中吗?您应该检查实体状态,确保在插入/更新对象之前已经修改了它。 - jon.r
我需要传递这些字段,以便将其强制设置为IsModified = true;,以便在Attach之后进行设置。 DbSet.Attach(entityToUpdate); foreach (var item in updateNullFields) { Context.Entry(entityToUpdate).Property(item).IsModified = true; } - Alexis Diel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接