Entity Framework Core DbContextOptionsBuilder.UseModel создает EntityTypes, которые не имеют свойств - PullRequest
0 голосов
/ 20 мая 2018

Я работаю над проектом .NET Core, использующим ядро ​​Entity Framework (2.0.1).

У меня есть архитектура плагинов, требующая загрузки различных моделей на основе подключенных плагинов, поэтому пытаюсь динамически загружать модели при добавлении dbcontext в контейнер DI с помощью метода DbContextOptionsBuilder.UseModel.

Независимо от того, определяю ли я новую модель или ModelBuilder, добавляемые мною EntityTypes, по-видимому, работают неправильно, и после добавления в dbcontext они не имеют никаких свойств.

Я не уверен, есть ли соглашение, которое мне нужно добавить, чтобы это работало, или то, что я могу упустить.Любая помощь будет оценена.

_services.AddDbContext<DataContext>(options =>
        {
            switch (_config.DatabaseType.ToLower())
            {
                case "postgres":
                    options.UseNpgsql(_config.ConnectionString);
                    break;
                case "sqlserver":
                    options.UseSqlServer(_config.ConnectionString);
                    break;
            }

            var convention = new Microsoft.EntityFrameworkCore.Metadata.Conventions.ConventionSet();
            var mb = new ModelBuilder(convention);
            foreach (var definition in definitionList)
            {
                mb.Entity(definition.Type);
            }
            options.UseModel(mb.Model);
        });

Разрешается в:

enter image description here

Правильно создает 5 типов EntityTypes, но затем, как только я развернуодин из типов сущностей не имеет свойств.

enter image description here

Если я сделаю то же самое, используя стандартное соглашение о добавлении EntityType с помощью переопределения dbcontext onmodelbuilding, все свойства будут там правильно ...

1 Ответ

0 голосов
/ 20 мая 2018

Да, есть несколько соглашений по умолчанию , одним из которых является PropertyDiscoveryConvention, что звучит так, как будто бы все свойства добавляются по умолчанию, но такжедругие, вероятно, важные, такие как KeyDiscoveryConvention, и множество соглашений, которые заботятся об идентификации атрибутов отображения.

Возможно, вы могли бы убедиться, что вы создаете правильные соглашения, но может быть легче перенести вашу логику вконтекст базы данных вместо.Таким образом, вы можете построить поверх всех стандартных соглашений, как обычно, и вам не нужно будет об этом заботиться самостоятельно.Так что, может быть, что-то вроде этого:

class MyContext : DbContext
{
    private readonly IDbContextConfigurator _dbContextConfigurator;
    public MyContext(DbOptions<MyContext> dbOptions, IDbContextConfigurator dbContextConfigurator)
        : base(dbOptions)
    {
        _dbContextConfigurator = dbContextConfigurator;
    }


    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        _dbContextConfigurator.Configure(modelBuilder);
    }
}

Итак, внутри этого IDbContextConfigurator вы можете получить свою конфигурацию и сконфигурировать свою модель непосредственно в конструкторе моделей.

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