我正在尝试使用虚拟导航属性序列化复杂对象。出于某种原因,当我尝试使用WebApi(从控制器返回)或使用JsonConvert.Serialize(myObject)
序列化此对象时,我的所有虚拟属性都为null。当我检查我的对象时,我可以看到所有这些都是代理对象。出于某种原因,json.net对这些代理对象的效果不佳。如何获取要序列化的虚拟属性?
答案 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")
来急切加载),则会出现严重的性能问题出现,特别是如果你有大型数据集。