如何从实体序列化为json?

Posted

技术标签:

【中文标题】如何从实体序列化为json?【英文标题】:How to serialize into a json from entity? 【发布时间】:2015-11-04 12:50:56 【问题描述】:

我正在尝试将(实体框架 6)实体序列化为 json。在通过 AsNoTracking() 方法进行序列化之前,我确保该条目在内存中,但是我收到一个错误,因为它无法从条目中引用的不同表中接收值。

Inner Exception: When an object is returned with a NoTracking merge option, Load can only be called when the EntityCollection or EntityReference does not contain objects.

Exception: JsonSerializationException:  Error getting value from 'TABLE_X' on 'System.Data.Entity.DynamicProxies....

代码:

List<Location> locations = new DbContext().Locations.Where(x => x.Type == 1).Take(5).AsNoTracking().ToList();
string s = JsonConvert.SerializeObject(locations, new JsonSerializerSettings()  ReferenceLoopHandling = ReferenceLoopHandling.Ignore );

我想要做的就是返回一个序列化实体的字符串。我不担心其他对象,只担心位置实体。

当我尝试处理连接然后进行 json 序列化时,我收到了错误:The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

我只想序列化我的列表,我不想返回/序列化任何外部依赖项。

【问题讨论】:

为什么需要序列化该实体? 因为我想将它存储在一个 json 文件中以备后用。例如。使用有效/有价值的数据进行单元测试。 我会理解存储 POCO 类,但现在存储 EF 实体,但你可能有不同的要求。 如果您将导航属性指定为Virtual,您应该能够直接从数据库中序列化整个实体。无需关闭代理或创建其他模型。或者,您可以预先加载所有导航属性? 【参考方案1】:

这是EF 的动态代理问题,您必须禁用它才能让您的代码正常工作

在你的类中继承自 DbContext

public class MyModelEntities : DbContext

   public MyModelEntities()
   
      //just disable it like this  
      Configuration.ProxyCreationEnabled = false;
   

主要是你的JsonConvert 试图序列化像System.Data.Entity.DynamicProxies.Location_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6 这样的对象

由于代理的原因,因为是动态创建的,所以找不到

【讨论】:

【参考方案2】:

您不需要调用AsNoTracking 方法将您需要的实体加载到内存中。 ToList 方法将完成这项工作。

现在关于您的问题,是因为 JSON 序列化程序正在尝试访问 Location 实例上的每个属性,而您最终可能会因为启用了延迟加载而查询整个数据库。所以,你有两个选择:

    Disable Lazy loading(正如@BRAHIMKamel 推荐的那样) 在您不想加载的导航属性上使用JsonIgnore 属性。

就个人而言,我更喜欢第一个,当我需要加载具有某些特定相关实体的实体时,我使用eager loading 将其加载为查询的一部分:

context.Locations
       .Include(l=>l.State)//eager loading an hypothetical related entity 
       .Where(x => x.Type == 1)
       .Take(5)
       .ToList();

【讨论】:

【参考方案3】:

如果您的对象图不是太复杂,不同的方法可能是创建简单的 POCO 类,您的 Location 将从中映射。假设LocationModel。这可以手动映射,例如使用 AutoMapper。

【讨论】:

以上是关于如何从实体序列化为json?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 序列化器:将 Json 反序列化为实体

将实体框架对象序列化为 JSON

在将实体框架对象图序列化为 Json 时防止 ***Exception

EF 将实体序列化为包含相关实体的 json 创建一个循环

使用杰克逊将双向 JPA 实体序列化为 JSON

Symfony - 将 json 反序列化为实体数组