首页 > 解决方案 > 实体框架,从 datetime 迁移到 datetimeoffset

问题描述

我们想要什么:

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

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

- 第一种方法:

主要建议这样做的方法(可以在这里看到)是:

  1. 使用新类型添加新列

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

  3. 删除旧列

  4. 重命名新列

-第二种方法:

但是还有另一种解决方案来完成这项工作,(可以在这里看到)我们这样改编:

    // 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')          
");
    } 

问题是:

采用第二种方法时,有什么重要的事情需要注意吗?
人们有什么理由喜欢第一种方法,尽管第二种方法更容易做到?是否有任何理由让您建议其中一种方法优于另一种?

标签: c#sql-serverentity-frameworkdatetimeoffset

解决方案


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

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


推荐阅读