【问题标题】:ASP.Net Web API returns null instead of non-simple propertiesASP.Net Web API 返回 null 而不是非简单属性
【发布时间】:2014-10-17 18:11:55
【问题描述】:

我刚开始尝试构建一些测试 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; }
}

并尝试通过

从数据库中获取所有记录
    public IEnumerable<Asset> GetAssets()
    {
        return db.Assets.AsEnumerable();
    }

我得到了一些奇怪的结果(至少这对我来说很奇怪)。而不是扩展 AssetType - 我得到 nil 的:

<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”)”添加它们是错误的。

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

【问题讨论】:

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


【解决方案1】:

这是因为延迟加载。

延迟加载是一个概念,我们将对象的加载延迟到我们需要它的地方。简而言之,按需加载对象,而不是不必要地加载对象。

当您执行.include 时,它实际上加载了该数据并且您能够获取它。

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

Entity Framework 4.1 default eager loading

【讨论】:

  • 我不认为这回答了 OP 的问题,我相信他正在寻找如何指定“热切地序列化/物化我的对象图”
  • 现在我明白了。 OP 没有使用 EF 的 virtual 关键字来动态代理他的 AssetType 属性,因此它在序列化时不存在。当 OP 指定 Include 最初水合整个对象时。
  • 好吧,谢谢@ArindamNayak。当我尝试添加虚拟关键字时 - asp.net 继续抱怨我,所以我会使用很多包含。
  • @soralex,看看 URL(我帖子的最后一行),有一些有用的方法。
猜你喜欢
  • 1970-01-01
  • 2014-04-29
  • 2015-05-23
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
相关资源
最近更新 更多