【问题标题】:EF6 Set DateTime to Null on UpdateEF6 在更新时将 DateTime 设置为 Null
【发布时间】: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。

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

【问题讨论】:

    标签: entity-framework entity-framework-6 dbcontext


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多