EF Core6中如何将Dictionary派生类型配置为非导航属性?
解决EF Core6将继承Dictionary的属性识别为导航属性的问题
方案1:显式配置为标量属性并指定值转换器
在DbContext的OnModelCreating方法中,对Notification的Links属性做明确配置,强制EF将其视为标量属性而非导航属性,同时绑定你的自定义JsonValueConverter:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Notification>(entity => { entity.Property(e => e.Links) .HasConversion<JsonValueConverter<LinkRelations>>() .HasColumnType("nvarchar(max)"); // 根据实际存储字段类型调整 }); }
方案2:全局配置覆盖Dictionary类型的默认处理
如果项目中多处用到LinkRelations类型,可以全局配置该类型的处理规则,让EF默认将其识别为标量属性:
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) { configurationBuilder.Properties<LinkRelations>() .HaveConversion<JsonValueConverter<LinkRelations>>() .HaveColumnType("nvarchar(max)"); }
方案3:通过元数据强制标记为非导航属性
如果以上方案仍不生效,可直接通过属性元数据修改EF的识别逻辑:
protected override void OnModelCreating(ModelBuilder modelBuilder) { var linksProperty = modelBuilder.Entity<Notification>().Property(e => e.Links); linksProperty.HasConversion<JsonValueConverter<LinkRelations>>(); // 强制标记为非导航属性 linksProperty.Metadata.IsNavigation = false; linksProperty.Metadata.SetField(null); }
内容的提问来源于stack exchange,提问作者mentat
相关产品推荐
相关产品推荐

