我正在使用实体框架核心 (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 的标准约定来做同样的事情,那么属性都在那里正确......
是的,有几个默认的公约,其中之一是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
您可以在其中检索配置并直接在模型构建器上配置模型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句