c# Json.Net序列化实体与虚拟属性

本文关键字:虚拟 属性 实体 序列化 Json Net | 更新日期: 2023-09-27 18:09:36

我正在尝试序列化一个具有虚拟导航属性的复杂对象。出于某种原因,当我尝试使用WebApi(从控制器返回)或JsonConvert.Serialize(myObject)序列化此对象时,我的所有虚拟属性都为空。当我检查我的对象时,我可以看到所有这些都是代理对象。由于某些原因,json.net不能很好地处理这些代理对象。如何使虚拟属性序列化?

c# Json.Net序列化实体与虚拟属性

这个问题,正如在评论中提到的,是试图序列化实体框架属性,这是懒惰加载不像那样工作。如果所有的代理链接都是链接的,那么您最终可能会通过一个简单的调用序列化整个数据库。

因此,在序列化时,任何未显式加载的内容都被赋予空值。每当您尝试加载代理对象时,都会进行数据库调用(每个对象一次)。

你可以用很多不同的方法来解决这个问题。假设您有以下实体对象:

public class Person
{
    public int ID
    public string PersonName
    public Address PersonAddress
}
public class Address
{
    public int ID
    public string AddressLine
}

假设你这样加载你的实体:

Person myPerson = ObjectContext.CreateObjectSet<Person>.Where(p => p.ID == 1);

您可以这样做(不推荐,因为它会创建两个单独的数据库调用):

Person myPerson = ObjectContext.CreateObjectSet<Person>.Where(p => p.ID == 1);
var x = myPerson.Address;

更好的方法是:

Person myPerson = ObjectContext.CreateObjectSet<Person>
.Include("PersonAddress")
.Where(p => p.ID == 1);

这将避免您的相关对象完全惰性加载。

巨大的警告

如果您尝试执行任何嵌套的即时加载(假设您有一个AddressCountry对象,并且您想通过将包含更改为.Include("PersonAddress.AddressCountry")来进行即时加载),可能会出现严重的性能问题,特别是如果您有大型数据集。