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

时间:2014-10-17 18:11:55

标签: c# asp.net asp.net-web-api

我刚刚开始尝试构建一些测试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“)”添加它们 - 是错误的。

所以问题是 - 我在哪里犯了错误?如何正确获取数据?

1 个答案:

答案 0 :(得分:2)

这是因为延迟加载。

延迟加载是一种概念,我们将对象的加载延迟到我们需要它的位置。简单地说,按需加载对象而不是不必要地加载对象。

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

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

Entity Framework 4.1 default eager loading