多个提供程序的迁移
EF Core 工具仅为当前活动的提供程序创建迁移文件,有时,你可能需要分别为多个提供程序创建迁移,有两种方法来处理这种情况:1、维护两个不同版本的迁移集;2、合并到单个迁移集,针对不同提供程序个性化设置。
维护两个不同版本的迁移集
Add-Migration InitialCreate -Context MyDbContext -OutputDir Migrations
SqlServerMigrations
Add-Migration InitialCreate -Context MySqliteDbContext -OutputDir Migrations
SqliteMigrations
dotnet ef migrations add InitialCreate --context MyDbContext --output-dir Migrations/SqlServerMigrations
dotnet ef migrations add InitialCreate --context MySqliteDbContext --output-dir Migrations/SqliteMigrations
合并到单个迁移集,针对不同提供程序个性化设置
Id = table.Column<int>(nullable: false)
.Annotation("SqlServer:ValueGenerationStrategy",
SqlServerValueGenerationStrategy.IdentityColumn)
.Annotation("Sqlite:Autoincrement", true),
if (migrationBuilder.ActiveProvider == "Microsoft.EntityFrameworkCore.SqlServer")
{
migrationBuilder.CreateSequence( name: "EntityFrameworkHiLoSequence");
}
自定义迁移历史记录表
默认情况下,EF Core 将已应用到数据库的(update-database)迁移,记录在
EFMigrationsHistory 迁移历史记录表中, 由于各种原因,你可能想要自定义此表,以更好地满足你的需求。
更改架构和表名
options.UseSqlServer(connectionString,x =>
x.MigrationsHistoryTable(" MyMigrationsHistory", "mySchema"));
其它更详细的配置
若要配置的表的其它方面,需要重写并替换 IHistoryRepository 服务。
class MyHistoryRepository : SqlServerHistoryRepository
{
public MyHistoryRepository(HistoryRepositoryDependencies dependencies)
: base(dependencies)
{
}
protected override void ConfigureTable(EntityTypeBuilder<HistoryRow> history)
{
base.ConfigureTable(history);
history.Property(h => h.MigrationId).HasColumnName("Id");
}
}
options .UseSqlServer(connectionString) .ReplaceService<IHistoryRepository, MyHistoryRepository>();
创建和删除API
// Drop the database if it exists dbContext.Database.EnsureDeleted(); // Create the database if it doesn't exist dbContext.Database.EnsureCreated();
微软同时提供了这些方法的异步版本。
若要使用的 EnsureCreated SQL,您可以使用 GenerateCreateScript 方法。
var sql = dbContext.Database.GenerateCreateScript();
仅当数据库中不存在任何表时,EnsureCreated 才会起作用。 如果有必要,也可以编写自己的检查逻辑,来查看架构是否需要进行初始化,可通过实现 IRelationalDatabaseCreator 接口来初始化架构。
/ TODO: Check whether the schema needs to be initialized // Initialize the schema for this DbContext var databaseCreator = dbContext.GetService<IRelationalDatabaseCreator>(); databaseCreator.CreateTables();
在生产平台中迁移
myDbContext.Database.EnsureCreated() myDbContext.Database.Migrate(); 推荐
使用 SQL 脚本