EF迁移:忽略模型中重叠有界上下文的部分

时间:2019-05-16 15:11:56

标签: c# .net-core ef-code-first ef-migrations dbcontext

我正在一个项目(API)上,其中有几个共享数据库的微服务(.NET Core 2.2和SQL Server 2017)。结果,有时我的上下文将具有重叠的dbset。我还应该提到我正在使用代码优先方法。

问题是,我想忽略dbcontext中包含的一些dbset来处理其原始微服务中的迁移。

所以我有一个SearchService,一个ResearchService和一个AuthorServiceSearchService查找作者在去年创建的内容,但仅获取基本信息,ResearchService获取有关作者的创作的详细信息,AuthorService获取有关作者的统计信息,他们的工作。

因此ResearchServiceAuthorService都使用了最初属于dbset<SearchedCreations>的{​​{1}}以及它们自己的数据库集SearchServiceResearchCreations,分别。

最近几天我一直在研究选项,并且遇到Author。但是问题是,如果我使用modelBuilder.Ignore<SearchedCreations>方法执行此操作,那么我将无法在运行时查询OnModelCreating。我将一路被忽略,而不仅仅是在迁移期间。

因此,我发现有人说使用进程名称来测试它是否是迁移,然后使用DbSet<SearchedCreations>进行测试,

modelBuilder.Ignore

当我使用.net core 2.0时,效果很好,但是似乎现在该过程已重命名,我不知道使用哪个名称。但无论如何,我觉得那太不稳定了,走了另一条路...

我决定添加一个公共属性if (System.Diagnostics.Process.GetCurrentProcess().ProcessName.ToLower() == "ef") { modelBuilder.Ignore<SearchedCreations>(); } 并将其默认设置为false。这样,先前的代码将如下所示:

isRuntime

这将满足我在迁移期间而不是运行时忽略SearchedCreations的要求。但是我的问题是我不知道在哪里或如何设置if (!isRuntime) { modelBuilder.Ignore<SearchedCreations>(); } 来完成这项工作。我本以为在第一次使用之前就在存储库的构造函数中执行此操作,但这似乎为时已晚,因为上下文已经完全忽略了SearchedCreations。

这里有更多我的代码,以防万一 在startup.cs

isRuntime = true

在ResearchCreationsContext.cs

public void ConfigureServices(IServiceCollection services)
{
     //other things that are irrelevant
     var connectionString = Startup.Configuration["connectionStrings:conStrExpress"];
     services.AddScoped<IResearchCreationsRepository, ResearchCreationsRepository>();
     services.AddDbContext<ResearchCreationsContext>(o => o.UseSqlServer(connectionString));
}

所以我的问题是,应该在何时何地设置public class ResearchCreationsContext: DbContext { public bool isRuntime { get; set; } = false; public DbSet<ResearchCreations> researchCreations { get; set; } public DbSet<SearchedCreations> searchedCreations { get; set; } public ResearchCreationsContext(DbContextOptions<ResearchCreationsContext> options) : base(options) { Database.Migrate(); } protected override void OnModelCreating(ModelBuilder modelBuilder) { if (!isRuntime) { modelBuilder.Ignore<SearchedCreations>(); } } } 才能使这项工作成功?

预先感谢,对于冗长的帖子,我深表歉意。这是我的第一次。我保证下次会做得更好=)

0 个答案:

没有答案