[英]Entity Framework Core DbContextOptionsBuilder.UseModel creates EntityTypes that have no properties
[英]Entity Framework custom ModelBuilder failing to be created properly when using the DbContextOptionsBuilder UseModel method
我有一個數據庫上下文,我想將一些邏輯與另一個文件中的 OnModelCreating 方法分開。
我當前在 AppDbContext 中的 onModelCreating 方法如下所示:
modelBuilder.ApplyConfigurationsFromAssembly(GetType().Assembly);
// modelBuilder.Seed();
if (Database.IsSqlite())
{
var options = new JsonSerializerOptions
{
IgnoreNullValues = true, IncludeFields = true
};
modelBuilder.Entity<Tenant>()
.Property(e => e.Profile)
.HasConversion(
v => JsonSerializer.Serialize(v, options),
v => JsonSerializer.Deserialize<TenantProfile>(v, options)!
);
}
它工作得很好,並檢查數據庫是否是 sqlite db,然后我添加了一些額外的邏輯來支持 jsonb 列序列化/反序列化,因為我的原始數據庫使用的是 postgres。
我的單元測試使用 Sqlite 內存連接。 我想將這段代碼分成一個單獨的文件,所以我創建了一個 TestWithSqlite.cs 文件,其中包含我使用 DbContextOptionsBuilder UseModel 方法配置的自定義 model:
//Create sqlite db model
ModelBuilder modelBuilder = new ModelBuilder(new ConventionSet());
modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly);
var jsonoptions = new JsonSerializerOptions { IgnoreNullValues = true, IncludeFields = true };
modelBuilder.Entity<Tenant>()
.Property(e => e.Profile)
.HasConversion(
v => JsonSerializer.Serialize(v, jsonoptions),
v => JsonSerializer.Deserialize<TenantProfile>(v, jsonoptions)!
);
var model = modelBuilder.Model.FinalizeModel();
var options = new DbContextOptionsBuilder<AppDbContext>()
.UseModel(model)
.UseSqlite(_connection)
.Options;
AppDbContext = new AppDbContext(options, mediatorMock.Object, _auditContext);
AppDbContext.Database.EnsureCreated();
但是,當我現在運行單元測試時,出現以下錯誤:錯誤
“無法映射屬性‘AppUser.AvatarImage’,因為它屬於‘字符串’類型,這不是受支持的原始類型或有效的實體類型。明確 map 此屬性,或使用‘[NotMapped]’忽略它屬性或通過在‘OnModelCreating’中使用‘EntityTypeBuilder.Ignore’。”
然而,字符串屬性是原始類型,我假設我沒有正確配置自定義 model。 任何幫助將非常感激。
編輯:當單元測試命中AppDbContext.Database.EnsureCreated();
方法
結果證明我使用的是帶有空ConventionSet
的modelBuilder
。 這個modelBuilder
不知道如何正確地 map 我的數據。 為了解決這個問題,我使用Microsoft.EntityFrameworkCore.MetaData.Conventions
命名空間提供的數據庫提供程序自定義ConventionSetBuilder
實例化了modelBuilder
。
ModelBuilder modelBuilder = SqliteConventionSetBuilder.CreateModelBuilder();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.