实体框架中的代码首先设置列以在 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的主要内容,如果未能解决你的问题,请参考以下文章