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
相关产品推荐
相关产品推荐

