实体框架,从datetime迁移到datetimeoffset

时间:2018-09-10 09:27:33

标签: c# sql-server entity-framework datetimeoffset

我们想要什么:

我们在sql server数据库的表中有一列,其数据类型为datetime。 我们决定将此列的数据类型更改为datetimeoffset(7)

到目前为止,我们得到了什么:

-第一种方法:

通常建议这样做的方式(可以看到here)是:

  1. 使用新类型添加新列

  2. 使用Sql()通过更新语句从原始列中接管数据

  3. 删除旧列
  4. 重命名新列

-第二种方法:

但是还有另一种解决方案可以做到这一点(可以在here中看到),我们对此进行了如下修改:

    // this is part of our migration file:

    public override void Up()
    {
        AlterColumn("_TableName_", "_ColumnName_", c => c.DateTimeOffset(nullable: true, precision: 7));
        Sql(@"
update Tralus.MelkRadar.Crawl
set _ColumnName_ = todatetimeoffset(_ColumnName_, '+04:30')          
");
    } 
  • AlterColumn更改数据库中的数据类型,同时保留数据并将offset的部分数据设置为00:00
  • 此后的Sql()语句更正了偏移量部分。

问题是:

采用第二种方法时,有什么重要的事情要注意吗?
尽管第二种方法更容易实现,但是人们为什么会偏爱第一种方法呢? 有什么理由使您建议其中一种方法而不是另一种方法?

1 个答案:

答案 0 :(得分:0)

如果您需要处理历史日期时间值(可能是在当地夏令时期间),我将选择选项2。更改列类型,然后使用sql更新值;

... _ColumnName_ = cast(_ColumnName_ as datetime2(7)) AT TIME ZONE '<name of timezone>'