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

EF Core 8中JSON属性与HasColumnName冲突问题求助

解决方案

问题根源是你同时用Property()和OwnsOne/OwnsMany配置了同一个属性:Property()会把PointArray和Geometry当成普通标量属性,而OwnsOne/OwnsMany会将其识别为导航属性,两者重名导致冲突。

无需改动模型的Pascal命名规范,直接修改DbContext配置即可解决:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Article>(a =>
    {
        a.ToTable("article");
        // 仅配置普通标量属性的列名
        a.Property(x => x.Id).HasColumnName("id");
        a.Property(x => x.DocId).HasColumnName("doc_id");
        a.Property(x => x.ArticleBody).HasColumnName("article_body");
        
        // 移除原有的PointArray、Geometry的Property配置,转而在Owns系列配置中指定列名
        a.OwnsMany(x => x.PointArray, y => 
        {
            y.ToJson().HasColumnName("point_array");
        });
        a.OwnsOne(x => x.Geometry, y => 
        {
            y.ToJson().HasColumnName("geometry");
        });
    });
}

原理说明

当使用OwnsOne/OwnsMany搭配ToJson()时,EF Core会将这些属性视为导航属性,用于映射嵌套JSON结构。此时不需要再用Property()单独配置列名,直接在ToJson()后链式调用HasColumnName(),就能在保留模型Pascal命名的同时,让数据库列使用snake_case格式。

修改后,EF Core会正确将PointArray映射为point_array列(jsonb类型,存储数组JSON),Geometry映射为geometry列(jsonb类型,存储单个对象JSON),不会再触发重名异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:37:16