EF Core - 属性“JObject.Next”不是虚拟的

Posted

技术标签:

【中文标题】EF Core - 属性“JObject.Next”不是虚拟的【英文标题】:EF Core - Property 'JObject.Next' is not virtual 【发布时间】:2021-12-14 02:18:48 【问题描述】:

我有一个使用字符串变量作为支持字段的 JObject。

    public class StaticTable
    
        public int StaticTableId  get; set; 
        private string _staticData;
        public JObject StaticData
        
            get => JsonConvert.DeserializeObject<JObject>(string.IsNullOrEmpty(_staticData) ? "" : _staticData);
            set => _staticData = value.ToString();
        
    

运行迁移时,我收到以下异常: System.InvalidOperationException: Property 'JObject.Next' is not virtual. 'UseChangeTrackingProxies' requires all entity types to be public, unsealed, have virtual properties, and have a public or protected constructor. 'UseLazyLoadingProxies' requires only the navigation properties be virtual.

【问题讨论】:

【参考方案1】:

你让 EF 感到困惑,它认为你想将 JObject 用于 Sql 数据类型,显然它抱怨是有充分理由的。

要么使用NotMapped 属性和真正的支持属性,或者更好的是,使用value converter:

值转换器允许在读取时转换属性值 从或写入数据库。这种转换可以来自一个值 到另一个相同类型的(例如,加密字符串)或从 一种类型的值到另一种类型的值(例如, 将枚举值与数据库中的字符串相互转换。)

protected override void OnModelCreating(ModelBuilder modelBuilder)

    modelBuilder
        .Entity<StaticTable>()
        .Property(e => e.StaticData)
        .HasConversion(
            v => ...,
            v => ...;

【讨论】:

以上是关于EF Core - 属性“JObject.Next”不是虚拟的的主要内容,如果未能解决你的问题,请参考以下文章

嵌套 tph 继承成员的 ef-core 负载收集属性

EF Core 6.0 导航属性未加载

AutoMapper + EF Core:查询嵌套属性等于值的位置

EF Core 2.0 Identity - 添加导航属性

5.EF Core 数据库映射模型隐藏属性配置

为 JObject 属性混合 EF Core Convensions 和 DBFunction