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