EF-Migration: игнорировать части модели для перекрывающегося ограниченного контекста - PullRequest
0 голосов
/ 16 мая 2019

Я работаю над проектом (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, чтобы эта работа работала?

Заранее спасибо, и мне очень жаль за длинный пост.Это мой первый.Я обещаю сделать лучше в следующий раз =)

...