【问题标题】:Entity Framework Core DbContextOptionsBuilder.UseModel creates EntityTypes that have no propertiesEntity Framework Core DbContextOptionsBuilder.UseModel 创建没有属性的 EntityType
【发布时间】:2018-05-20 09:35:27
【问题描述】:

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

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

无论我定义了新模型还是模型构建器,我添加的实体类型似乎都没有正确执行,并且一旦添加到 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 个实体类型,但是一旦我展开其中一个实体类型,它就没有属性了。

如果我使用通过覆盖 dbcontext onmodelbuilding 添加 EntityType 的标准约定执行相同操作,则所有属性都正确...

【问题讨论】:

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


    【解决方案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 中,您可以检索您的配置并直接在模型构建器上配置您的模型。

    【讨论】:

    • 非常感谢,我想这一定是关于约定的,但我找不到太多关于它的信息。在查看了您的源代码参考后,我绝对认为我会遵循您推荐的方法。将来升级版本时,这似乎是一个潜在的维护难题。
    猜你喜欢
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 2018-08-12
    相关资源
    最近更新 更多