运行 应用迁移脚本时的自定义代码
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:
基本上,在我的 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: