JsonElement 属性无法使用 Sqlite 在 EF Core 中映射



我正试图使用Sqlite内存中数据库在我的基于Entity Framework Core 5的项目上运行单元测试,但在初始化DbContext时遇到了一个错误,这在生产NpgsqlPostgres驱动程序或EF Cores自己的内存中数据库中都没有发生。

System.InvalidOperationException:"无法映射属性"AlertDefinition.Parameters",因为它的类型为"Nullable",而该类型不是受支持的基元类型或有效的实体类型。"。显式映射此属性,或使用"[NotMapped]"特性或使用"OnModelCreating"中的"EntityTypeBuilder.ignore"忽略它

我不知道如何在不影响真正的Postgres数据库功能的情况下解决这个问题,这正是我所希望的。

相关实体类别

public class AlertDefinition
{
[Required]
public JsonElement? Parameters { get; set; }
public List<AlertOutput>? Outputs { get; set; }
}
public class Rule
{
public Guid? Id { get; set; }
[StringLength(254)]
public string Name { get; set; } = string.Empty;
[Required]
public AlertDefinition AlertDefinition { get; set; } = null!;
}
public class RulesDbContext : DbContext
{
public DbSet<Rule> Rules { get; set; } = null!;
public DbSet<AlertOutput> AlertOutputs { get; set; } = null!;
public RulesDbContext(DbContextOptions options)
: base(options) { }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// Define AlertDefinition as an owned entity
modelBuilder.Entity<Rule>()
.OwnsOne(r => r.AlertDefinition, adBuilder =>
{
adBuilder.OwnsMany(ad => ad.Outputs, oBuilder =>
{
oBuilder.HasKey(o => o.Id);
oBuilder.ToTable("alert_outputs");
});
});
}
}

我以前在内存数据库中使用EF Core,但这不能继续使用,因为我现在使用的是它不支持的功能,在需要运行单元测试的CI上使用Postgres进行单元测试即使不是不可能,也是很困难的。

这是一种糟糕的做法,但在某些情况下可能是务实的:

modelBuilder.Entity<Rule>(entity =>
{
if(UnitTestDetector.IsRunningFromNUnit)
{
//unit test mapping
entity.Ignore(e => e.Parameters);
}
else { "your default mapping" }

UnitTestDetector.IsRunningFromNUnit假设NUnit

最新更新