如何从实体序列化为 json?
How to serialize into a json from entity?
我正在尝试将一个 (Entity Framework 6) 实体序列化为 json。在通过 AsNoTracking() 方法序列化之前,我确保该条目在内存中,但是我收到一个错误,因为它无法接收条目中引用的不同 table 的值。
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 });
我只想return序列化实体的字符串。我不担心其他对象,只担心位置实体。
当我尝试处理连接然后 json 序列化时,我收到错误:The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
我只想序列化我的列表,我不想return/serialize任何外部依赖项。
这是一个 EF
的动态代理问题,您必须禁用它才能让您的代码正常工作
在您的 class 中继承自 DbContext
public class MyModelEntities : DbContext
{
public MyModelEntities()
{
//just disable it like this
Configuration.ProxyCreationEnabled = false;
}
}
主要是您的 JsonConvert
正在尝试序列化这样的对象 System.Data.Entity.DynamicProxies.Location_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6
由于代理,无法找到,因为它是动态创建的
如果您的对象图不是太复杂,不同的方法可能是创建简单的 POCO class,您的 Location
将从中映射。假设 LocationModel
。这可以手动映射或例如使用 AutoMapper。
您不需要调用 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();
我正在尝试将一个 (Entity Framework 6) 实体序列化为 json。在通过 AsNoTracking() 方法序列化之前,我确保该条目在内存中,但是我收到一个错误,因为它无法接收条目中引用的不同 table 的值。
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 });
我只想return序列化实体的字符串。我不担心其他对象,只担心位置实体。
当我尝试处理连接然后 json 序列化时,我收到错误:The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
我只想序列化我的列表,我不想return/serialize任何外部依赖项。
这是一个 EF
的动态代理问题,您必须禁用它才能让您的代码正常工作
在您的 class 中继承自 DbContext
public class MyModelEntities : DbContext
{
public MyModelEntities()
{
//just disable it like this
Configuration.ProxyCreationEnabled = false;
}
}
主要是您的 JsonConvert
正在尝试序列化这样的对象 System.Data.Entity.DynamicProxies.Location_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6
由于代理,无法找到,因为它是动态创建的
如果您的对象图不是太复杂,不同的方法可能是创建简单的 POCO class,您的 Location
将从中映射。假设 LocationModel
。这可以手动映射或例如使用 AutoMapper。
您不需要调用 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();