Я работаю над проектом (API), где у меня есть несколько микросервисов, совместно использующих базу данных (.NET Core 2.2 и SQL Server 2017).В результате, иногда мой контекст будет иметь перекрывающиеся наборы данных.Я должен также упомянуть, что я использую код вначале.
Дело в том, что я хотел бы игнорировать некоторые наборы dbsets, которые включены в мой dbcontext, для обработки миграции в их исходном микросервисе.
Итак, у меня есть SearchService
, ResearchService
и AuthorService
.SearchService
ищет то, что автор создал в прошлом году, но получает только основную информацию, ResearchService
получает подробную информацию о творениях для автора и AuthorService
получает статистику об авторе и его работе.
Таким образом, ResearchService
и AuthorService
используют dbset<SearchedCreations>
, который изначально принадлежал SearchService
, вместе со своими собственными dbsets ResearchCreations
и Author
соответственно.
IЯ изучал варианты в последние несколько дней, и я столкнулся с modelBuilder.Ignore<SearchedCreations>
.Но дело в том, что если я сделаю это в методе OnModelCreating
, то я не смогу запросить DbSet<SearchedCreations>
во время выполнения.Меня будут игнорировать полностью, а не только во время миграций.
Итак, я нашел кого-то, кто сказал, что используют имя процесса, чтобы проверить, если это миграция, а затем modelBuilder.Ignore
, например:
if (System.Diagnostics.Process.GetCurrentProcess().ProcessName.ToLower() == "ef")
{
modelBuilder.Ignore<SearchedCreations>();
}
Это работало очень хорошо, когда я занимался .net core 2.0, но похоже, что теперь процесс был переименован, и я не знаю, на какое имя.Но в любом случае я чувствую, что это слишком нестабильно и идет другим путем ...
Я решил добавить публичное свойство isRuntime
и установить его в false по умолчанию.Таким образом, предыдущий код будет выглядеть следующим образом:
if (!isRuntime)
{
modelBuilder.Ignore<SearchedCreations>();
}
. И он удовлетворит мое требование игнорировать SearchedCreations во время миграции, а не во время выполнения.Но моя проблема в том, что я не знаю, где или как установить isRuntime = true
, чтобы это работало.Я думал сделать это в конструкторе моего репозитория перед первым использованием, но, похоже, уже слишком поздно, потому что контекст уже проигнорировал SearchedCreations навсегда.
Вот немного больше моего кода на случай, если онпомогает в startup.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));
}
в ResearchCreationsContext.cs
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>();
}
}
}
Так что мой вопрос: когда и где мне установить isRuntime = true
, чтобы эта работа работала?
Заранее спасибо, и мне очень жаль за длинный пост.Это мой первый.Я обещаю сделать лучше в следующий раз =)