将可为 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 的情况下取得进展。
我在我的项目中使用 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 的情况下取得进展。