为什么在没有导航属性的情况下序列化我的响应?

时间:2018-01-05 21:11:54

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

今天我的代码遇到了一个小问题。我有一个类似于以下的HttpGet方法:

[HttpGet]
public IEnumerable<SomeEntity> Get()
{
    return db.SomeEntity.ToList();
}

其中SomeEntity可以表示为

public class SomeEntity
{
    #region DatabaseColumns
    [Key]
    public int SomeEntityID { get; set; }
    public string SomeEntityName { get; set; }
    #endregion

    #region Navigation Properties
    public virtual ICollection<SomeChildEntity> SomeChildEntity { get; set; }
    #endregion
}

我注意到return db.SomeEntity.ToList();只返回了对象的顶级成员(而不是导航属性)。

考虑到我没有打电话给Include,这对我有意义。出于好奇,我尝试了以下方法:

[HttpGet]
public IEnumerable<SomeEntity> Get()
{
    var enumeratedEntity = db.SomeEntity.ToList();
    return enumeratedEntity;
}

令我惊讶的是,它返回了整个实体及其导航属性。

我还注意到这些行中的HttpGet也返回了整个对象

[HttpGet]
public SomeEntity Get(int id)
{
    return db.SomeEntity.Find(id);
}

有人可以解释,或指向我将解释的资源,为什么这些方法在不使用Includes方法的情况下返回整个对象而第一个方法没有?

1 个答案:

答案 0 :(得分:0)

我不是百分之百,所以请随意测试,然后向上或向下投票。当您返回for /f "tokens=*" %%G in (%userprofile%\loctest.txt) do (set testvar=%%G) 时,您不会定义具体类型。您将返回一些通用IEnumerable,然后HTTP管道将虚拟属性剥离出来。

当您致电IEnumerable<SomeEntity>时,您会创建一个列表。然后,该具体对象将立即实例化虚拟属性。然后,整个具体对象沿管道发送,包括虚拟属性。

您可以通过将var enumeratedEntity = db.SomeEntity.ToList();更改为var enumeratedEntity = db.SomeEntity.ToList();IEnumerable<SomeEntity> enumeratedEntity = db.SomeEntity.ToList();来对此进行测试。然后,您希望根据您使用的通用容器查看目前看到的2种行为。