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

Updating a nullable DateTime field as null results in default DateTime value (0001-01-01 00:00:00.0000000)

我在我的项目中使用 ASP.NET 样板 MVC(非核心)模板,它使用 EF6 作为 ORM。数据库是 SQL Server Express。

这是我的实体对象(忽略不相关的属性):

public class Asset : AggregateRoot<long>
{
    [DataType(DataType.DateTime)]
    public DateTime? LastControlTime { get; set; }
}

当我创建新资产时,此字段适当地创建为 NULL。所以,一开始一切都按预期进行。但是当我尝试用一​​个简单的服务调用来更新一个对象时,它搞砸了。

这是应用服务中的方法class:

public void ResetLastControlTime (EntityDto<long> input)
{
    var asset = Repository.Get(input.Id);
    asset.LastControlTime = default(DateTime?);
}

这应该将该字段重置为空。我也试过asset.LastControlTime = null;。但最后它在数据库中的那个字段中写入了“0001-01-01 00:00:00.0000000”。我在代码中有很多地方可以控制空值,所以现在我不得不更改大量旧文件,或者我必须找到某种方法将该字段重置为简单的 NULL。

我在这里检查了类似的问题,但找不到答案。所有这些都讲述了我已经拥有的可为空的 DateTime。在 SQL 服务器 table 模式中,数据类型是 datetime2(7),所以我想这也是正确的。哦,删除 DataType 注释也没有改变任何东西。

那么我在这里缺少什么?我应该检查什么才能发现问题?

我想如果所有其他方法都失败了,您可以通过重新实现 属性:

来简化大部分代码
public class Asset : AggregateRoot<long>
{
    public DateTime? _LastControlTime;
    [DataType(DataType.DateTime)]
    public DateTime? LastControlTime { 
      get {
        return _LastControlTime;
      }
      set {
        if (value == DateTime.MinValue) {
          _LastControlTime = null;
        } else {
          _LastControlTime = value;
        }
    }
}

它并没有真正切入问题的核心,但可以让您在无需更改整个程序中所有 == null 和 .HasValue 的情况下取得进展。