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.State
在 rec
初始化时可能是 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)