我有一个ASP.NET应用程序,该应用程序将实体框架用于Code First数据库。
我通过迭代枚举模型创建了一个迁移,以将QuestionTypes播种到数据库中的表中。我想使用迁移为数据提供种子,而不是使用Configuration.cs
中的Seed方法,因为我想从迁移中产生一个SQL文件,该文件将在生产服务器上的构建过程中使用。
public override void Up()
{
var _db = new ApplicationDbContext();
//Loop over enum and add to DB
foreach (QuestionTypeEnum questionType in (QuestionTypeEnum[])Enum.GetValues(typeof(QuestionTypeEnum)))
{
_db.QuestionTypes.Add(new Models.QuestionType
{
QuestionType = questionType
});
}
_db.SaveChanges();
}
当我运行update-database -script
来生成SQL文件时,我需要在生产数据库上进行此迁移,该代码似乎具有预期的效果,并且我的数据库中填充了正确的数据。但是,除了与样板迁移相关的内容外,自动生成的SQL文件为空:
INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])
当我运行get-migrations
时,我可以看到数据库正在迁移中,而我要尝试应用的迁移之前,并且如果我直接将SQL写入迁移中,则能够生成有意义的SQL文件:
public override void Up()
{
Sql("INSERT INTO QuestionType VALUES (1,'FreeText')");
}
产生:
INSERT INTO QuestionType VALUES (1,'FreeText')
INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])
我的问题是:为什么此处描述的第一种方法在调用update-database -script
时未能生成有意义的SQL文件?与ApplicationDbContext()
的使用有关吗?也许生成SQL脚本的功能不知道如何解释我编写的C#逻辑。
在这种情况下,手工编写SQL作为一个临时解决方案不太麻烦,但是我想知道如何在将来无法手动编写SQL的情况下使C#方法起作用