[英]Entity Framework custom ModelBuilder failing to be created properly when using the DbContextOptionsBuilder UseModel method
[英]Entity Framework Core DbContextOptionsBuilder.UseModel creates EntityTypes that have no properties
我正在使用實體框架核心(2.0.1)進行.NET Core項目。
我有一個插件架構,需要根據所連接的插件來加載不同的模型,因此在使用DbContextOptionsBuilder.UseModel方法將dbcontext添加到DI容器時,嘗試動態加載模型。
無論我定義新的Model還是ModelBuilder,我添加的EntityType似乎都無法正確執行,並且一旦添加到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個EntityType,但是一旦我展開其中一個Entity Type,它就沒有屬性。
如果我使用通過dbcontext onmodelbuilding的覆蓋添加EntityType的標准約定進行相同的操作,則所有屬性都正確存在...
是的, 默認情況下有一些約定 ,其中之一是PropertyDiscoveryConvention
,聽起來像可以確保默認添加所有屬性,還有其他可能重要的KeyDiscoveryConvention
,例如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
內部檢索配置並直接在模型構建器上配置模型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.