Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在没有导航属性的情况下序列化我的响应?_C#_Entity Framework_Asp.net Web Api - Fatal编程技术网

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

C# 为什么在没有导航属性的情况下序列化我的响应?,c#,entity-framework,asp.net-web-api,C#,Entity Framework,Asp.net Web Api,今天我的代码遇到了一个小问题。我有一个类似于以下内容的HttpGet方法: [HttpGet] public IEnumerable<SomeEntity> Get() { return db.SomeEntity.ToList(); } [HttpGet] public IEnumerable<SomeEntity> Get() { var enumeratedEntity = db.SomeEntity.ToList(); return en

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

[HttpGet]
public IEnumerable<SomeEntity> Get()
{
    return db.SomeEntity.ToList();
}
[HttpGet]
public IEnumerable<SomeEntity> Get()
{
    var enumeratedEntity = db.SomeEntity.ToList();
    return enumeratedEntity;
}
我注意到
返回db.SomeEntity.ToList()仅返回对象的顶级成员(而不是导航属性)

考虑到我没有调用
Include
,这对我来说是有意义的。出于好奇,我尝试了以下几点:

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

有人能解释一下,或者给我指一下将要解释的参考资料,为什么这些方法不使用
Includes
方法而返回整个对象,而第一个方法不使用?

我对此不是100%,请随意测试,然后向上或向下投票给我。当您返回一个
IEnumerable
时,您没有定义具体的类型。您将返回一些通用IEnumerable,然后HTTP管道会从中剥离虚拟属性


调用
var enumeratedEntity=db.SomeEntity.ToList()时创建一个列表。然后,该具体对象立即实例化虚拟属性。然后将整个具体对象发送到管道中,包括虚拟属性


您可以通过更改
var enumeratedEntity=db.SomeEntity.ToList()来测试这一点
to
IEnumerable EnumerateIdentity=db.SomeEntity.ToList()
列表EnumerateIdentity=db.SomeEntity.ToList()。然后,您将看到当前基于您使用的通用容器看到的两种行为。

第一种行为是否有子实体?如果没有,则该属性将被忽略。是的,在这两种情况下,它们都有子实体。很高兴知道,谢谢!您是否禁用了延迟加载?您没有包含导航属性,因此它们为空。即使启用了延迟加载,我认为依靠序列化程序为您获取导航属性也不是一个好主意。在序列化结果之前,应该特别使用.Include()并处理跟踪上下文。
var enumeratedEntity=db.SomeEntity.ToList()
List enumeratedEntity=db.SomeEntity.ToList()完全相同到编译器。不完全正确。Var将创建一个变量,该变量取决于所讨论方法的返回类型。在这个实例中,ToList()返回一个列表是正确的。但这种创造发生在幕后,对开发者是隐藏的。ToQueryable()将返回一个IQueryable(),因此var将创建它。将EnumerateIdentity显式定义为一个列表可以消除任何潜在的歧义
ToList()
始终返回一个
列表
它不能返回任何其他内容。因此,对编译器来说,它们是完全相同的。