我正在从事一个使用 EF Code First 的项目。我正在尝试使用迁移功能。我不想使用包控制台管理器。如何以编程方式执行“添加迁移”和“更新数据库”?
add-migration TestMigration01 -force
update-database
您有几个选择。您可以在代码中使用 dbmigrator 类:http://romiller.com/2012/02/09/running-scripting-migrations-from-code/
或者您可以使用 migrate.exe,它可以方便地在构建步骤等中运行它们。 https://msdn.microsoft.com/en-us/data/jj618307.aspx
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
。<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();