可以将实体框架核心配置为在项目构建期间生成迁移

时间:2016-11-25 10:44:06

标签: asp.net-core-mvc entity-framework-core .net-core

我正在尝试为持续集成准备一个新项目。 我的项目是用.Net Core编写的,并使用Entity Framework Core进行数据库访问。 我需要尝试做的是在我的项目中添加一个预构建步骤来添加新的迁移。 我已经设置了webapp以在启动时应用所有迁移,但实际上并不想在提交代码之前手动创建迁移。我认为这应该是CI设置的一部分,因为我可能会在开发过程中经历数百次数据库更改,但是当我部署最新代码时,我希望为每个版本发布一个迁移脚本。

我目前正在使用.Net Core和EF Core的所有nuget dependancies的v1.1.0。

编辑: 来自J.Pichardo的链接类似于我的要求。但据我所知,它是关于应用迁移(我已经在我的代码中工作)。

bricelam的回答可能是我想要完成的代码版本。但是,我希望有一种方法可以配置project.json文件,以便它使用生成的迁移名称运行Add-Migration脚本(理想情况下使用可由我的CI设置的环境变量)。 p>

这将允许我在开发期间手动创建迁移,但随后让我的CI在每个发布过程的最后阶段创建完整的迁移。

1 个答案:

答案 0 :(得分:0)

可以以编程方式生成迁移,但我不推荐它。为此,请参考Microsoft.EntityFrameworkCore.Design包并使用类似于以下内容的代码。

using (var context = new MyDbContext())
{
    var services = ((IInfrastructure<IServiceProvider>)context).Instance;
    var codeHelper = new CSharpHelper();
    var scaffolder = ActivatorUtilities.CreateInstance<MigrationsScaffolder>(
        services,
        new CSharpMigrationsGenerator(
            codeHelper,
            new CSharpMigrationOperationGenerator(codeHelper),
            new CSharpSnapshotGenerator(codeHelper)));

    var migration = scaffolder.ScaffoldMigration(
        "MyMigration",
        "MyApp.Data");
    File.WriteAllText(
        migration.MigrationId + migration.FileExtension,
        migration.MigrationCode);
    File.WriteAllText(
        migration.MigrationId + ".Designer" + migration.FileExtension,
        migration.MetadataCode);
    File.WriteAllText(migration.SnapshotName + migration.FileExtension,
        migration.SnapshotCode);
}