C# 拦截SQLServerMigrationSqlGenerator以阻止某些表的迁移?
我尝试使用EF Core 3.0迁移,将现有表和先用代码构建的新表混合使用。为了防止现有表的脚手架,我想用一个属性(流畅或注释)装饰模型类,这样就跳过了这些表的迁移代码生成,但模型仍然构建在DbContext类中 我采用的方法是在onconfigurang中添加以下行C# 拦截SQLServerMigrationSqlGenerator以阻止某些表的迁移?,c#,entity-framework,entity-framework-core,entity-framework-migrations,C#,Entity Framework,Entity Framework Core,Entity Framework Migrations,我尝试使用EF Core 3.0迁移,将现有表和先用代码构建的新表混合使用。为了防止现有表的脚手架,我想用一个属性(流畅或注释)装饰模型类,这样就跳过了这些表的迁移代码生成,但模型仍然构建在DbContext类中 我采用的方法是在onconfigurang中添加以下行 optionsBuilder.ReplaceService<IMigrationsSqlGenerator, SkipMigrator>(); 我假设是Generate方法触发了迁移代码文件的创建,但它从未被调用。我
optionsBuilder.ReplaceService<IMigrationsSqlGenerator, SkipMigrator>();
我假设是Generate
方法触发了迁移代码文件的创建,但它从未被调用。我应该在另外一个地方拦截代码生成吗
是否有其他/更简单的方法告诉迁移跳过表,但仍将它们保留在我的DbContext中
是否有其他/更简单的方法告诉迁移跳过表,但仍将它们保留在我的DbContext中
是的,但它需要一种不同的方法
不要使用当前的DbContext
类来创建迁移,而应仅为创建迁移而创建一个SecondDbContext
类。这个新的SecondDbContext
类将保存您希望EF在其上进行迁移的dbset
然后,在调用
添加迁移更新表-c SecondDbContext
和更新数据库-c SecondDbContext
时,只需指定第二个上下文您尝试创建自己的IMigrationSqlGenerator的方法是正确的,我以前使用过这种方法来修改作为迁移一部分生成的SQL
services.AddDbContext(opt=>
{
opt.UseSqlServer();
opt.ReplaceService();
});
但是,从EF Core 5.0开始,现在使用TableBuilder上的ExcludeFromMigrations()
方法从迁移中排除特定表要容易得多:
public class ReportingContext:DbContext
{
公共数据库集用户{get;set;}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity().ToTable(用户名,t=>t.ExcludeFromMigrations());
}
}
更多信息:
public class SkipMigrator:SqlServerMigrationsSqlGenerator
{
public SkipMigrator(
MigrationsSqlGeneratorDependencies dependencies,
IMigrationsAnnotationProvider migrationsAnnotations)
: base(dependencies, migrationsAnnotations){}
protected override void Generate(
MigrationOperation operation,
IModel model,
MigrationCommandListBuilder builder)
{
if (operation.FindAnnotation("SkipMigrations")!=null)
{
Console.WriteLine("Skipping table:");
}
else
{
base.Generate(operation,model,builder);
}
}
}