C#Json.Net使用虚拟属性序列化实体

时间:2013-04-16 20:21:43

标签: c# asp.net-web-api json.net

我正在尝试使用虚拟导航属性序列化复杂对象。出于某种原因,当我尝试使用WebApi(从控制器返回)或使用JsonConvert.Serialize(myObject)序列化此对象时,我的所有虚拟属性都为null。当我检查我的对象时,我可以看到所有这些都是代理对象。出于某种原因,json.net对这些代理对象的效果不佳。如何获取要序列化的虚拟属性?

1 个答案:

答案 0 :(得分:4)

正如评论中提到的那样,问题是尝试序列化延迟加载的实体框架属性并不像那样工作。如果链接了所有代理链接,您最终可以通过简单的调用来序列化整个数据库。

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

你可以通过多种不同方式解决这个问题。想象一下,你有以下实体对象:

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")来急切加载),则会出现严重的性能问题出现,特别是如果你有大型数据集。