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

dis*_*ame 5 c# sql-server datetime entity-framework datetime2

我有一个价值

DateTime dt = DateTime.Parse("2015-10-12 14:24:40.582");
Run Code Online (Sandbox Code Playgroud)

用它我做:

SomeEntity someEntity = new SomeEntity() 
{
    ID = 1, 
    ChangedOn = dt
};
context.SomeEntities.Add(someEntity);
Run Code Online (Sandbox Code Playgroud)

我发现:在数据库表中存储的值是"2015-10-12 14:24:40.58 3 0000"

我手动找到它

SELECT CONVERT(datetime2, ChangedOn) FROM SomeEnititiesTable WHERE ID=1;
Run Code Online (Sandbox Code Playgroud)

我从数据库加载someEntity并执行

bool ok = someEntity.ChangedOn.Equals(dt);
Run Code Online (Sandbox Code Playgroud)

问题是,ok == false当我期待ok == true.:|

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

Nas*_*ine 6

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

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

[Column(TypeName = "datetime2")]
Run Code Online (Sandbox Code Playgroud)

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

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    // ...

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)


dis*_*ame 1

解决方案

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

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

3)比较

someEntity.ChangedOn2.Equals(dt.Ticks);
Run Code Online (Sandbox Code Playgroud)