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“)”添加它们 - 是错误的。
所以问题是 - 我犯了一个错误?我如何正确获取我的数据?
这是因为延迟加载。
延迟加载是一个概念,我们延迟对象的加载直到需要它的点。简单地说,按需加载对象而不是不必要地加载对象。
当你做了.include
,它实际上加载了这些数据,你就可以得到它。
没有预设加载的默认配置。您必须始终定义包含或创建一些可重用的方法,它将包装添加包含。
我不认为这回答OP的问题,我相信他正在寻找如何指定“热切地序列化/实现我的对象图” – 2014-10-17 18:19:10
@ChrisMarisic,更新后 – 2014-10-17 18:19:59
啊现在我明白了。 OP没有使用虚拟关键字EF来动态代理他的AssetType属性,因此它在序列化时不存在。当OP指定了包含最初水合完整对象的“Include”时。 – 2014-10-17 18:24:30
注意我相信你可以只使用'公共虚拟AssetType AssetType {获得;组; }'但你需要小心有关ORM的N + 1问题http://stackoverflow.com/questions/97197/what-is-the-n1-selects-issue我个人厌恶ORM中的延迟加载。 – 2014-10-17 18:25:23