如何在 EntityFramework Codefirst 中以编程方式使用迁移?

问题描述 投票:0回答:2

我正在从事一个使用 EF Code First 的项目。我正在尝试使用迁移功能。我不想使用包控制台管理器。如何以编程方式执行“添加迁移”和“更新数据库”?

add-migration TestMigration01 -force

update-database
c# entity-framework ef-code-first entity-framework-6 entity-framework-migrations
2个回答
17
投票

您有几个选择。您可以在代码中使用 dbmigrator 类:http://romiller.com/2012/02/09/running-scripting-migrations-from-code/

或者您可以使用 migrate.exe,它可以方便地在构建步骤等中运行它们。 https://msdn.microsoft.com/en-us/data/jj618307.aspx


0
投票

EF Core 解决方案:

public static void AddMigration()
{
    var h1 = new OperationReportHandler(
        errorHandler: (x) =>
        {
            throw new Exception(x);
        },
        warningHandler: (x) => 
        {
            Debug.WriteLine($"Warn, {x}");
        });

    var reporter = new OperationReporter(h1);

    Assembly asm = asm; // your Assembly
    Assembly startupAsm = asm; // your Assembly

    var rootNs = "Database\\_Migrations";
    var snapshotNS = "Database\\_Migrations";

    var solRoot = "<your Solution root HERE>";
    var projRoot = Path.Combine(solRoot.FullName, "<ProjName HERE>");

    var outputDir = Path.Combine(projRoot, rootNs);

    var args = new string[0]; // args like force here 
    var nullable = false; // nullable Ref Types
    string language = null; // defaults to "C#"

    var sec = ((long)(DateTime.UtcNow - StartDate).TotalSeconds);
    var migrationName = $"M_{sec}"; // your Migration Name

    MigrationsOperations migrationsOperations = new MigrationsOperations(
        reporter,
        asm, startupAsm, projRoot, rootNs,
        language, nullable, args);

    var ctxType = typeof(DbContextCreator).FullName; // your ContextType here

    MigrationFiles migrationFiles =
        migrationsOperations.AddMigration(migrationName, outputDir, ctxType, snapshotNS);
}

private static DateTime StartDate = new DateTime(2024, 04, 01);

安装 Nuget

Microsoft.EntityFrameworkCore.Design

然后调整.csproj

<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.3">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets></IncludeAssets>
</PackageReference>

您必须清除

IncludeAssets
才能使用
Microsoft.EntityFrameworkCore.Design
的内部类型。


我尝试了代码,它生成了与包管理器控制台相同的文件:

Add-Migration -OutputDir Database\_Migrations -Context DbContextCreator

更新数据库只是:

ctx.Database.Migrate();
© www.soinside.com 2019 - 2024. All rights reserved.