Entity framework core dotnet ef迁移添加:仅在发生更改时创建迁移文件
我正在使用Entity framework core dotnet ef迁移添加:仅在发生更改时创建迁移文件,entity-framework-core,entity-framework-core-migrations,Entity Framework Core,Entity Framework Core Migrations,我正在使用dotnet ef migrations add{MigrationName}来创建新的迁移 如果没有实体/上下文更改,这将使用空的Up(MigrationBuilder MigrationBuilder)和Down(MigrationBuilder MigrationBuilder)函数创建迁移 是否有办法让migrations add命令跳过“空”文件的创建 或者,在运行migrations add命令之前,是否有方法检测是否有更改?我不知道这是否可能,但是空迁移也很有用,就像您想
dotnet ef migrations add{MigrationName}
来创建新的迁移
如果没有实体/上下文更改,这将使用空的Up(MigrationBuilder MigrationBuilder)
和Down(MigrationBuilder MigrationBuilder)
函数创建迁移
是否有办法让migrations add命令跳过“空”文件的创建
或者,在运行
migrations add
命令之前,是否有方法检测是否有更改?我不知道这是否可能,但是空迁移也很有用,就像您想手动运行任何脚本一样,例如,创建/更改StoredProcedures/Trigger。为此,您可以专门为特定目的生成空迁移。我找到了解决此问题的方法
有一种方法可以代替使用CLI
查看后,我设法修改了第一个链接中的代码,以支持我的需求:
using (var db = new MyDbContext())
{
var reporter = new OperationReporter(
new OperationReportHandler(
m => Console.WriteLine(" error: " + m),
m => Console.WriteLine(" warn: " + m),
m => Console.WriteLine(" info: " + m),
m => Console.WriteLine("verbose: " + m)));
var designTimeServices = new ServiceCollection()
.AddSingleton(db.GetService<IHistoryRepository>())
.AddSingleton(db.GetService<IMigrationsIdGenerator>())
.AddSingleton(db.GetService<IMigrationsModelDiffer>())
.AddSingleton(db.GetService<IMigrationsAssembly>())
.AddSingleton(db.Model)
.AddSingleton(db.GetService<ICurrentDbContext>())
.AddSingleton(db.GetService<IDatabaseProvider>())
.AddSingleton<MigrationsCodeGeneratorDependencies>()
.AddSingleton<ICSharpHelper, CSharpHelper>()
.AddSingleton<CSharpMigrationOperationGeneratorDependencies>()
.AddSingleton<ICSharpMigrationOperationGenerator, CSharpMigrationOperationGenerator>()
.AddSingleton<CSharpSnapshotGeneratorDependencies>()
.AddSingleton<ICSharpSnapshotGenerator, CSharpSnapshotGenerator>()
.AddSingleton<CSharpMigrationsGeneratorDependencies>()
.AddSingleton<IMigrationsCodeGenerator, CSharpMigrationsGenerator>()
.AddSingleton<IOperationReporter>(reporter)
.AddSingleton<MigrationsScaffolderDependencies>()
.AddSingleton<ISnapshotModelProcessor, SnapshotModelProcessor>()
.AddSingleton<MigrationsScaffolder>()
.BuildServiceProvider();
var scaffolderDependencies = designTimeServices.GetRequiredService<MigrationsScaffolderDependencies>();
var modelSnapshot = scaffolderDependencies.MigrationsAssembly.ModelSnapshot;
var lastModel = scaffolderDependencies.SnapshotModelProcessor.Process(modelSnapshot?.Model);
var upOperations = scaffolderDependencies.MigrationsModelDiffer.GetDifferences(lastModel, scaffolderDependencies.Model);
var downOperations = upOperations.Any() ? scaffolderDependencies.MigrationsModelDiffer.GetDifferences(scaffolderDependencies.Model, lastModel) : new List<MigrationOperation>();
if (upOperations.Count() > 0 || downOperations.Count() > 0)
{
var scaffolder = designTimeServices.GetRequiredService<MigrationsScaffolder>();
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);
}
}
使用(var db=new MyDbContext())
{
var reporter=新的OperationReporter(
新OperationReportHandler(
m=>Console.WriteLine(“错误:+m),
m=>Console.WriteLine(“警告:+m),
m=>Console.WriteLine(“信息:+m),
m=>Console.WriteLine(“verbose:+m));
var designTimeServices=new servicecolection()
.AddSingleton(db.GetService())
.AddSingleton(db.GetService())
.AddSingleton(db.GetService())
.AddSingleton(db.GetService())
.AddSingleton(db.Model)
.AddSingleton(db.GetService())
.AddSingleton(db.GetService())
.AddSingleton()
.AddSingleton()
.AddSingleton()
.AddSingleton()
.AddSingleton()
.AddSingleton()
.AddSingleton()
.AddSingleton()
AddSingleton先生(记者)
.AddSingleton()
.AddSingleton()
.AddSingleton()
.BuildServiceProvider();
var scaffolderDependencies=designTimeServices.GetRequiredService();
var modelsnashot=scaffolderDependencies.MigrationsAssembly.modelsnashot;
var lastModel=scaffolderDependencies.SnapshotModelProcessor.Process(modelSnapshot?.Model);
var upOperations=scaffolderDependencies.migrationModelDifference.GetDifferences(lastModel,scaffolderDependencies.Model);
var downOperations=upOperations.Any()?scaffolderDependencies.migrationModelDifference.GetDifferences(scaffolderDependencies.Model,lastModel):新列表();
if(upOperations.Count()>0 | | downOperations.Count()>0)
{
var scaffolder=designTimeServices.GetRequiredService();
var migration=scaffolder.ScaffoldMigration(
“MyMigration”,
“MyApp.Data”);
File.writealText(
migration.MigrationId+migration.FileExtension,
migration.MigrationCode);
File.writealText(
migration.MigrationId+“.Designer”+migration.FileExtension,
迁移(元数据代码);
File.WriteAllText(migration.SnapshotName+migration.FileExtension,
迁移(快照代码);
}
}
我知道空迁移是有帮助的,但最好同时具备这两种可能性。