You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遵循Npgsql指南映射JSON列时遇MainCategory实体未映射表错误

问题:EF Core映射JSON列时遇到实体未映射错误

我尝试按照Npgsql的JSON映射指南将类映射到JSON列,但一直遇到以下错误:

System.InvalidOperationException: 实体类型'MainCategory'未映射到表,因此无法将实体持久化到数据库。请在'OnModelCreating'中调用'ToTable'以将其映射到表。

我的模型代码如下:

public class Post
{
    // ...
    public MainCategory MainCategory { get; set; }  
}

public class Category
{
}

public class Category<TParent> where TParent: Category
{
    // ...
    [JsonIgnore] 
    public TParent Parent { get; set; }
}

public class Category<TParent, TChildren> where TParent: Category, where TChildren: Category
{
    [Column(TypeName = "jsonb")] 
    public ICollection<Category> Children { get; set; }
}

public class MainCategory : Category<Category, Category>
{
}

对应的上下文代码:

public class MyContext : DbContext 
{
    public DbSet<Post> Posts => Set<Post>();

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Post>()
            .OwnsOne(c => c.MainCategory, r =>
            {
                r.ToJson();
                r.OwnsMany(c => c.Children);
            });

         base.OnModelCreating(modelBuilder);
    }
} 

子类别具有不同的属性,因此正确的父子关系对我来说非常重要——如果仅使用Category会很难实现。我还尝试使用两个接口来表示父/子关系,但始终遇到相同的错误。如果移除Children上的[Column(TypeName = "jsonb")],则会出现以下错误:

System.InvalidOperationException: 无法确定导航属性'OneOfTheSubCategories.Children'(类型为ICollection<Category>)所表示的关系。请手动配置关系,或使用'[NotMapped]'属性或在'OnModelCreating'中使用'EntityTypeBuilder.Ignore'忽略此属性。

我不确定自己哪里出错了,或者这是否是一个完全不被支持的场景。必要时我可以在Post类中仅使用string并手动转换,但我试图避免这种情况。当前使用的是最新的.NET 9.0版本。

内容的提问来源于stack exchange,提问作者Camilo Terevinto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 17:26:01