使用C#进行代码优先迁移会产生空的SQL文件

时间:2018-08-15 14:33:00

标签: c# database entity-framework migration code-first

我有一个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#方法起作用

0 个答案:

没有答案