Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 拦截SQLServerMigrationSqlGenerator以阻止某些表的迁移?_C#_Entity Framework_Entity Framework Core_Entity Framework Migrations - Fatal编程技术网

C# 拦截SQLServerMigrationSqlGenerator以阻止某些表的迁移?

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方法触发了迁移代码文件的创建,但它从未被调用。我

我尝试使用EF Core 3.0迁移,将现有表和先用代码构建的新表混合使用。为了防止现有表的脚手架,我想用一个属性(流畅或注释)装饰模型类,这样就跳过了这些表的迁移代码生成,但模型仍然构建在DbContext类中

我采用的方法是在onconfigurang中添加以下行

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);
        }
    }
}