我正在使用实体框架核心(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);
});
解析为:
正确创建5个EntityTypes,但是一旦我展开其中一个实体类型,它就没有属性。
如果我使用通过覆盖dbcontext onmodelbuilding添加EntityType的标准约定来做同样的事情,那么这些属性都是正确的......
答案 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
内,您可以直接在模型构建器上检索配置并配置模型。