运行 应用迁移脚本时的自定义代码

Running custom code when applying migration script

基本上,在我的 EF 数据库中,我首先使用 EF 代码向 table 添加了一个 DateTime 行。

现在是这样的:

    public class Employee
    {
        [Key]
        public int Id { get; set; }

        public DateTime Date { get; set; } //this has been added
    }

如您所见,日期不可为空 - 因此我需要在 运行 迁移时初始填充日期。

这是生成的迁移脚本:

    public partial class Changed_Employee : DbMigration
    {
        public override void Up()
        {
            AddColumn("dbo.Employees", "Date", c => c.DateTime(nullable: false));
        }
    }

问题是,我想 运行 一些自定义 C# 逻辑以确定每个人的确切日期 "Employee"。

但是,我该怎么做呢?

最简单的方法:

在迁移期间将所有 date/time 设置为 00.00.0000

Sql("UPDATE Employees SET Date= -DATEDIFF(MINUTE, CurrentTime, 0)";

当应用程序启动时,您可以创建一个使用 C# 更新数据的自定义种子方法:

优点: 很简单

缺点: 当您有多个迁移级别时,您将丢失一些迁移逻辑(日期时间转换)。数据将在稍后通过应用程序启动进行转换。

顺便说一下,也许您还需要将日期列设置为可为空并用数据填充它,然后在脚本末尾更改 table 并将该列更改为可为空,否则迁移将不工作。

AddColumn("dbo.Employees", "Date", c => c.DateTime(nullable: true));
..
..
.. 
Sql("Update....")
..
..
AlterColumn("dbo.Employees", "Date", c => c.DateTime(nullable: false));

对于不同的方法,您必须在此处阅读我的 post: