簡體   English   中英

使用 DbContextOptionsBuilder UseModel 方法時無法正確創建實體框架自定義 ModelBuilder

[英]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(); 方法

結果證明我使用的是帶有空ConventionSetmodelBuilder 這個modelBuilder不知道如何正確地 map 我的數據。 為了解決這個問題,我使用Microsoft.EntityFrameworkCore.MetaData.Conventions命名空間提供的數據庫提供程序自定義ConventionSetBuilder實例化了modelBuilder

ModelBuilder modelBuilder = SqliteConventionSetBuilder.CreateModelBuilder();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM