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

时间:2016-08-10 13:01:51

标签: c# entity-framework ef-code-first entity-framework-6 ef-migrations

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

现在的情况如下:

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

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

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

以下是生成的迁移脚本:

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

问题是,我想运行一些自定义C#逻辑,以确定每个“员工”的确切日期。

但是,我该怎么做?

1 个答案:

答案 0 :(得分:1)

最简单的方法:

在迁移期间,将所有日期/时间设置为00.00.0000

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

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

<强>优点: 很容易

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

顺便说一下,你可能还需要将Date列设置为nullable并用数据填充它,然后在脚本末尾更改表并将列更改为nullable,否则迁移将无效。

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

对于不同的方法,你必须在这里阅读我的帖子: Read database during an entity framework migration (select query)