使用 Entity Framework Core 将数据存储和检索为 JSON 字符串?

Posted

技术标签:

【中文标题】使用 Entity Framework Core 将数据存储和检索为 JSON 字符串?【英文标题】:Storing and retrieving data as JSON string with Entity Framework Core? 【发布时间】:2021-01-01 17:03:30 【问题描述】:

我正在尝试将对象存储为 JSON。然后,使用 C# 将其从 JSON 字符串转换回具有 Entity Framework Core 3 的对象。

我有以下 2 个模型类:

public class A
    
    public int Id  get; set; 

    // more properties

    // I want to store the data as json.
    public CustomObject Object  get; set; 


public class CustomObject

    public int? Id  get; set; 
    public int[] ItemIds  get; set; 
    public string Value  get; set; 

然后在我的DbContext 中添加了以下内容

protected override void OnModelCreating(ModelBuilder modelBuilder)

    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<A>.Property(x => x.Object).HasConversion(
         v => JsonConvert.SerializeObject(v, new JsonSerializerSettings  NullValueHandling = NullValueHandling.Ignore ),
         v => JsonConvert.DeserializeObject<T>(v, new JsonSerializerSettings  NullValueHandling = NullValueHandling.Ignore )
            );

但是,当应用程序运行时,我收到以下错误

System.InvalidOperationException:“无法映射属性“Object.ItemIds”,因为它的类型为“int[]”,它不是受支持的原始类型或有效的实体类型。要么显式映射此属性,要么使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略它。

当我尝试在这样的通用类中设置实体时会发生该错误

Repository = context.Set<A>();

如何使用 Entity Framework Core 正确地将 JSON 字符串转换为对象并将对象转换回 JSON 字符串?

【问题讨论】:

您能否包含导致该异常被抛出的语句? @devNull 我更新了问题以显示在哪里。它发生在context.Set&lt;A&gt;() 被调用时 你不会在你的上下文中有一个DbSet&lt;CustomObject&gt; 吗? 我不知道。我在 DbContext 中列出了 DbSet 【参考方案1】:

问题是 EF 默认添加了复杂类型“或围绕这些行”。为了忽略它,我添加了以下内容并且它起作用了

protected override void OnModelCreating(ModelBuilder modelBuilder)

    base.OnModelCreating(modelBuilder);

    modelBuilder.Ignore<CustomObject>();
    // ...

【讨论】:

以上是关于使用 Entity Framework Core 将数据存储和检索为 JSON 字符串?的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework Core 性能优化

在 Entity Framework Core 中使用 [ComplexType]

在 Entity Framework Core 中使用 SQL 视图

使用 Entity Framework Core 更新相关数据

使用 Entity Framework Core 自动增加部分主键

如何使用 Entity Framework Core 模拟异步存储库