实体框架中的代码首先设置列以在 sql server 中键入 datetime2

Posted

技术标签:

【中文标题】实体框架中的代码首先设置列以在 sql server 中键入 datetime2【英文标题】:Code first in entity framework set column to type datetime2 in sql server 【发布时间】:2016-08-29 17:50:09 【问题描述】:

我有一个价值

DateTime dt = DateTime.Parse("2015-10-12 14:24:40.582");

我愿意:

SomeEntity someEntity = new SomeEntity() 

    ID = 1, 
    ChangedOn = dt
;
context.SomeEntities.Add(someEntity);

我发现:在数据库表中存储的值是“2015-10-12 14:24:40.5830000”

我手动发现的

SELECT CONVERT(datetime2, ChangedOn) FROM SomeEnititiesTable WHERE ID=1;

我从数据库加载 someEntity 并做

bool ok = someEntity.ChangedOn.Equals(dt);

问题是ok == false 当我期望ok == true 时。 :|

如何让实体框架中的代码优先在迁移中生成 datetime2 类型的列而不是 datetime?

【问题讨论】:

【参考方案1】:

如何让实体框架中的代码首先在迁移中生成datetime2类型的列而不是datetime

要指定要使用的列的类型,您可以将以下属性添加到模型的属性ChangedOn

[Column(TypeName = "datetime2")]

或者,如果您使用的是 Fluent API,那么您可以将其添加到您的 OnModelCreating 或您的 DBContext

protected override void OnModelCreating(DbModelBuilder modelBuilder)

    base.OnModelCreating(modelBuilder);

    // ...

    modelBuilder.Entity<someEntity>()
        .Property(p => p.ChangedOn)
        .HasColumnType("datetime2");

    // ...

【讨论】:

【参考方案2】:

解决方案

1) 添加一个类型为 long 的字段 ChangedOn2。

2) 将 dt.Ticks 值保存到 ChangedOn2。

3) 比较

someEntity.ChangedOn2.Equals(dt.Ticks);

【讨论】:

以上是关于实体框架中的代码首先设置列以在 sql server 中键入 datetime2的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server Compact Edition 中将实体框架代码中的主键首先播种为 0

遍历 pandas 数据框中的所有列以在分隔符上拆分

提取 csv 文件特定列以在 Python 中列出

实体框架中的问题建模关系首先使用代码

实体框架代码首先进行连接状态检查

实体框架代码在数据库迁移后首先回滚