我刚刚开始尝试构建一些测试ASP.Net Web API应用程序,并遇到了问题:
我有模特:
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; }
}
并尝试通过
从db获取所有记录 public IEnumerable<Asset> GetAssets()
{
return db.Assets.AsEnumerable();
}
我得到了一些奇怪的结果(至少对我来说很奇怪)。而不是扩展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 :(得分:2)
这是因为延迟加载。
延迟加载是一种概念,我们将对象的加载延迟到我们需要它的位置。简单地说,按需加载对象而不是不必要地加载对象。
当你.include
时,它实际上加载了这些数据,你就可以得到它。
预先加载没有默认配置。您必须始终定义Include或创建一些可重用的方法,它将包装添加include。