Добавление нового DbSet в DbContext после запуска приложения и создания DbContext - PullRequest
0 голосов
/ 14 октября 2019

У меня есть проект, в бизнесе он динамически создает таблицу, работает с netcore3.0 и EF. Когда экземпляр dbcontext создается после создания динамической таблицы, я буду использовать Assembly Emit для создания нового типа таблицы и использовать метод OnModelCreating для добавления наборов dbsets, соответствующих таблицам.

public class ApplicationDbContext : IdentityDbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

    public virtual DbSet<Book> Books { get; set; }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        //Use assmbly emit to create dynamic types
        var types = CreateDynamicTypes();

        foreach (var type in types)
        {
            builder.Entity(type);
        }

        base.OnModelCreating(builder);
    }
}

Но когда таблица создается после создания dbcontext, я пока не знаю, как добавить новый dbset, потому что OnModelCreating запускается только 1 раз.

Вопрос: Как сделатьЯ добавляю новые dbsets в экземпляр dbcontext после его создания?

1 Ответ

1 голос
/ 14 октября 2019

OnModelCreating запускается только 1 раз (при первой инициализации) из-за снижения производительности.

Есть один способ обойти это, используя "Model Customizer"

Во-первых, вам нужно немного настроить OnConfiguring (вам нужно переопределить базовую реализацию)

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        base.OnConfiguring(optionsBuilder);

        var serviceCollection = new ServiceCollection()
            .AddEntityFrameworkSqlServer();


        serviceCollection = serviceCollection.AddSingleton<IModelCustomizer, YourModelCustomizer>();

        var serviceProvider = serviceCollection.BuildServiceProvider();

        optionsBuilder
            .UseInternalServiceProvider(serviceProvider);
    }

И ваш настройщик должен выглядеть так:

public class YourModelCustomizer : ModelCustomizer
    {
        public override void Customize(ModelBuilder modelBuilder, DbContext dbContext)
        {
            base.Customize(modelBuilder, dbContext);

            var entityTypeBuilderCart = modelBuilder.Entity<Models.Cart>()
                .ToTable("ABC");
            entityTypeBuilderCart.Property(a => a.UserId).HasColumnName("XYZ");
            entityTypeBuilderCart.Property(a => a.ContractorId).HasColumnName("DFG");
            entityTypeBuilderCart.Ignore(a => a.CompanyId);

            var entityTypeBuilderCartArticle = modelBuilder.Entity<Models.CartArticle>()
                .ToTable("IJK");
            entityTypeBuilderCartArticle.Property(a => a.UserId).HasColumnName("QWE");
        }

        public YourModelCustomizer(ModelCustomizerDependencies dependencies) : base(dependencies)
        {
        }
    }

Надеюсь, это поможет вам.

Помните, что такая конфигурация может вызвать проблемы с производительностью. Этот код работает в EF Core 2.x, в EF 3.x могут быть некоторые изменения, и этот код может потребовать некоторых изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...