4

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

4

1 回答 1

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 更改为 be 来预加载.Include("PersonAddress.AddressCountry")),可能会出现严重的性能问题,尤其是在您拥有大型数据集的情况下。

于 2013-04-16T21:30:44.447 回答