EF6 在更新时将 DateTime 设置为 Null

Posted

技术标签:

【中文标题】EF6 在更新时将 DateTime 设置为 Null【英文标题】:EF6 Set DateTime to Null on Update 【发布时间】:2017-04-04 02:58:13 【问题描述】:

您可能认为这与其他问题相同,但我已经检查并找不到答案,所以请任何人帮忙...

我有这个类,它有许多其他属性,但让我们专注于这 2 个......

public class MyClass

    public DateTime? EndDate  get; set; 
    public string State  get; set; 

EndDate 和 State 在数据库中都有一些值。 前任。 EndDate = 2016-11-20 00:00:00 和 State = "Closed"。

我需要更改这些值,所以我有一个操作按钮可以执行此操作...

using (MyContext ctx = new MyContext())

    MyClass rec = new MyClass  Id = Id ;
    db.MyClasses.Attach(rec);
    rec.State = "Opened";
    rec.EndDate = null;
    db.Configuration.ValidateOnSaveEnabled = false;
    ctx.SaveChanges();
    db.Configuration.ValidateOnSaveEnabled = true;

但是,当我运行此命令时,数据库中的状态更改为“已打开”,但 EndDate 的值仍与以前相同,我的意思是它不会变为 NULL。

我在这里做错了什么? 谢谢

【问题讨论】:

【参考方案1】:

这是因为您实际上并没有更改结束日期:

MyClass rec = new MyClass  Id = Id ;
db.MyClasses.Attach(rec);
...
rec.EndDate = null;

但是当你附加实体时它是null

所以你必须告诉更改跟踪器该属性已被修改:

db.Entry(rec).Property(r => r.EndDate).IsModified = true;

【讨论】:

做得很好。稍作改动... db.Entry(rec).Property(r => r.EndDate).IsModified = true;谢谢。 但是rec.State 是如何毫无问题地改变的呢? @Sampath rec.Staterec 初始化时可能是 null 是的,但 OP 提到该值已正确更新,不是吗?我的意思是在State 属性上没有.IsModified = true 当然,在这种情况下,更改跟踪器会注意到更改null =>“已打开”。但是,EndDate 设置为 null,而它已经是 null

以上是关于EF6 在更新时将 DateTime 设置为 Null的主要内容,如果未能解决你的问题,请参考以下文章

强制实体框架使用 datetime 而非 datetime2

Mysql:创建表时将DATETIME的格式设置为'DD-MM-YYYY HH:MM:SS'

将可为空的 DateTime 字段更新为 null 会导致默认 DateTime 值 (0001-01-01 00:00:00.0000000)

在目标 c 中使用 jsonModel 映射时将默认值设置为空字段

EF6中一个关于时间类型 datetime2 的坑

如何防止 Azure ML Studio 在导入数据集时将特征列转换为 DateTime