EF Core 5 配置Backing field报错:未找到属性对应的指定字段
错误原因
你遇到的报错核心有2个:
HasField方法仅支持关联类的字段,你代码中的_staticData是带{ get; set; }访问器的私有属性,不是字段,EF Core无法识别到该字段。StaticData是JObject类型,与数据库存储的string类型不匹配,需要显式配置类型映射规则。
解决步骤
- 首先将
_staticData改为标准私有字段,删除属性访问器 - 补充Fluent API配置,指定属性访问策略与数据库字段类型
- 可选:将JSON序列化/反序列化逻辑改为EF Core值转换器实现,简化实体代码
修改后可运行代码示例
using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; public class StaticTable { public int StaticTableId { get; set; } // 改为私有字段,不要加{get;set;} private string _staticData; public JObject StaticData { get => JsonConvert.DeserializeObject<JObject>(string.IsNullOrEmpty(_staticData) ? "{}" : _staticData); // 建议用无格式序列化减少数据库存储空间占用 set => _staticData = value.ToString(Formatting.None); } public static void RunFluent(ModelBuilder modelBuilder) { EntityTypeBuilder<StaticTable> entity = modelBuilder.Entity<StaticTable>(); entity.Property(s => s.StaticData) .HasField("_staticData") // 配置EF Core优先读写字段,避免不必要的序列化开销 .UsePropertyAccessMode(PropertyAccessMode.Field) // 显式指定数据库存储类型为长文本 .HasColumnType("nvarchar(max)"); } }
更简洁的推荐写法(使用值转换器)
你也可以把JSON转换逻辑放到EF Core配置中,实体类无需单独定义 backing field:
public class StaticTable { public int StaticTableId { get; set; } public JObject StaticData { get; set; } } public static void RunFluent(ModelBuilder modelBuilder) { EntityTypeBuilder<StaticTable> entity = modelBuilder.Entity<StaticTable>(); entity.Property(s => s.StaticData) .HasConversion( // 写入数据库时的转换逻辑 v => v == null ? "{}" : v.ToString(Formatting.None), // 从数据库读取时的转换逻辑 v => string.IsNullOrEmpty(v) ? JObject.Parse("{}") : JObject.Parse(v) ) .HasColumnType("nvarchar(max)"); }
内容的提问来源于stack exchange,提问作者Samuel Carswell
相关产品推荐
相关产品推荐

