使用 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<A>()
被调用时
你不会在你的上下文中有一个DbSet<CustomObject>
吗?
我不知道。我在 DbContext 中列出了 DbSet
【参考方案1】:
问题是 EF 默认添加了复杂类型“或围绕这些行”。为了忽略它,我添加了以下内容并且它起作用了
protected override void OnModelCreating(ModelBuilder modelBuilder)
base.OnModelCreating(modelBuilder);
modelBuilder.Ignore<CustomObject>();
// ...
【讨论】:
以上是关于使用 Entity Framework Core 将数据存储和检索为 JSON 字符串?的主要内容,如果未能解决你的问题,请参考以下文章
在 Entity Framework Core 中使用 [ComplexType]
在 Entity Framework Core 中使用 SQL 视图
使用 Entity Framework Core 更新相关数据