实体框架核心DbContextOptionsBuilder.UseModel创建没有属性的EntityTypes

时间:2018-05-20 09:35:27

标签: c# .net asp.net-core entity-framework-core

我正在使用实体框架核心(2.0.1)开发.NET Core项目。

我有一个插件架构,需要根据附加的插件加载不同的模型,因此在使用DbContextOptionsBuilder.UseModel方法将dbcontext添加到DI容器时尝试动态加载模型。

无论我是定义新模型还是模型构建器,我添加的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

如果我使用通过覆盖dbcontext onmodelbuilding添加EntityType的标准约定来做同样的事情,那么这些属性都是正确的......

1 个答案:

答案 0 :(得分:1)

是的,there are a few conventions by default,其中一个是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内,您可以直接在模型构建器上检索配置并配置模型。