ASP.Net的Web API返回null而不是非简单属性

问题描述:

我刚开始试图建立一些测试ASP.Net的Web API的应用程序,并得到了一个问题:ASP.Net的Web API返回null而不是非简单属性

我有型号为:

public class Asset 
{ 
    public int Id { get; set; } 
    [ForeignKey("AssetType")] 
    public int AssetTypeId { get; set; } 
    public AssetType AssetType { get; set; } 
} 
public class AssetType 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

,并试图通过

public IEnumerable<Asset> GetAssets() 
    { 
     return db.Assets.AsEnumerable(); 
    } 

从数据库获取的所有记录,我得到一些奇怪的结果(ATLEAST这对我来说很奇怪)。而是扩大AssetType的 - 我得到零的:

<Asset> 
<AssetTypeId>1</AssetTypeId> 
<Id>1</Id> 
<AssetType i:nil="true"/> 
</Asset> 

我检查我的数据库 - 它包含两个AssetTypeId和AssetType领域正确的ID,指向正确的资产类型。 我发现得到扩大领域唯一的办法 - 通过改变GetAssets到:

public HttpResponseMessage GetAssets() 
    { 
     return Request.CreateResponse(HttpStatusCode.OK, db.Assets.Include("Type").ToList()); 
    } 

但我觉得我是非常错误的,因为在现实中,我有几十个这样的“复杂”领域的一些它们嵌套,并通过“.Include(”Type“)”添加它们 - 是错误的。

所以问题是 - 我犯了一个错误?我如何正确获取我的数据?

+0

注意我相信你可以只使用'公共虚拟AssetType AssetType {获得;组; }'但你需要小心有关ORM的N + 1问题http://stackoverflow.com/questions/97197/what-is-the-n1-selects-issue我个人厌恶ORM中的延迟加载。 – 2014-10-17 18:25:23

这是因为延迟加载。

延迟加载是一个概念,我们延迟对象的加载直到需要它的点。简单地说,按需加载对象而不是不必要地加载对象。

当你做了.include,它实际上加载了这些数据,你就可以得到它。

没有预设加载的默认配置。您必须始终定义包含或创建一些可重用的方法,它将包装添加包含。

Entity Framework 4.1 default eager loading

+0

我不认为这回答OP的问题,我相信他正在寻找如何指定“热切地序列化/实现我的对象图” – 2014-10-17 18:19:10

+0

@ChrisMarisic,更新后 – 2014-10-17 18:19:59

+1

啊现在我明白了。 OP没有使用虚拟关键字EF来动态代理他的AssetType属性,因此它在序列化时不存在。当OP指定了包含最初水合完整对象的“Include”时。 – 2014-10-17 18:24:30