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

C# 实体框架核心DbContextOptionsBuilder.UseModel创建没有属性的EntityTypes,c#,.net,asp.net-core,entity-framework-core,C#,.net,Asp.net Core,Entity Framework Core,我正在使用EntityFrameworkCore2.0.1进行一个.NETCore项目 我有一个插件体系结构,需要根据附加的插件加载不同的模型,因此在使用DbContextOptionsBuilder.UseModel方法将dbcontext添加到DI容器时,尝试动态加载模型 无论我是定义一个新模型还是一个ModelBuilder,我添加的EntityTypes看起来都不正确,并且一旦添加到dbcontext中,就没有任何属性 我不确定是否有一个公约,我需要添加这项工作,或我可能会错过什么。任何

我正在使用EntityFrameworkCore2.0.1进行一个.NETCore项目

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

无论我是定义一个新模型还是一个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);
        });
决议如下:

正确地创建了5个EntityTypes,但是一旦我展开其中一个实体类型,它就没有属性了

如果我使用标准约定(通过重写ModelBuilding上的dbcontext来添加EntityType)执行相同操作,则属性都正确地存在…

是的,其中之一是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中,您可以检索配置并直接在model builder上配置模型。

非常感谢您的支持,我想它一定是关于约定的,但我找不到太多关于它的信息。在看过你的源代码参考之后,我肯定会遵循你推荐的方法。将来升级版本时可能会遇到维护方面的麻烦。