我正在一个项目(API)上,其中有几个共享数据库的微服务(.NET Core 2.2和SQL Server 2017)。结果,有时我的上下文将具有重叠的dbset。我还应该提到我正在使用代码优先方法。
问题是,我想忽略dbcontext中包含的一些dbset来处理其原始微服务中的迁移。
所以我有一个SearchService
,一个ResearchService
和一个AuthorService
。 SearchService
查找作者在去年创建的内容,但仅获取基本信息,ResearchService
获取有关作者的创作的详细信息,AuthorService
获取有关作者的统计信息,他们的工作。
因此ResearchService
和AuthorService
都使用了最初属于dbset<SearchedCreations>
的{{1}}以及它们自己的数据库集SearchService
和ResearchCreations
,分别。
最近几天我一直在研究选项,并且遇到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>();
}
}
}
才能使这项工作成功?
预先感谢,对于冗长的帖子,我深表歉意。这是我的第一次。我保证下次会做得更好=)