【发布时间】:2020-12-07 09:06:46
【问题描述】:
我正在使用 .Net Core 2.2 和实体框架。我需要在 SQL Server 中插入一些数据。
在 C# 中我使用 DateTime 数据类型,在 SQL Server 中我使用 datetime2(6) - 默认值为:(sysdatetime())。
例如我的对象看起来像:
public partial class Contact
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime CreatedTime { get; set; }
}
如果我在创建对象时将 CreatedTime 保留为 null,并将其留给 SQL Server 使用默认值 (sysdatetime()),我将得到类似:2020-05-19 09:31:12.383593 在数据库中。
据我了解,DateTime 数据类型本身已经精确到微秒,但是,如果我为 CreatedTime 属性设置一个值,例如:
obj.CreatedTime = DateTime.Now.AddTicks(123);
Console.WriteLine(obj.CreatedTime.ToString("yyyy-MM-dd HH:mm:ss.ffffff"));
我可以在控制台中看到值,应该是 2020-08-18 07:42:52.131102 。但是当通过 EntityFramwork 插入该 obj 时,数据库中的值将只是毫秒: 2020-08-18 07:42:52.131000 。它看起来像 EntityFramework 以某种方式仅以毫秒精度传递 DateTime?
非常感谢您的支持。
【问题讨论】:
-
您需要使用 DateTime2 日期类型
modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));或modelBuilder.Entity<SomeEntiity>().Property(f => f.SomeDate).HasColumnType("datetime2"); -
我的猜测是,在某个地方,EF 一定是在推断 SQL 数据类型,但它弄错了。您可能想要使用数据注释:
[Column(TypeName = "DateTime2(6)")](尽管official documentation 声称在面向 SQL Server 时 DateTime 的默认映射是 DateTime2(7)) -
谢谢大家!我真的很感谢你的帮助! @Michael Randall 非常感谢您解决了我的问题!你能把它作为答案发布吗?我会把它标记为正确答案!
-
@CodeCaster - 是的,但如果他需要的值比数据库以日期时间格式保存的更精确,那么值得考虑(也许他不在这里,如果 DateTime2 会覆盖它,那么没关系,这只是我之前必须考虑的)
标签: c# sql-server entity-framework datetime