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
.net Web Api 2.2-OData正在扩展没有$expand参数的数据_.net_Entity Framework_Asp.net Web Api2_Odata - Fatal编程技术网

.net Web Api 2.2-OData正在扩展没有$expand参数的数据

.net Web Api 2.2-OData正在扩展没有$expand参数的数据,.net,entity-framework,asp.net-web-api2,odata,.net,Entity Framework,Asp.net Web Api2,Odata,根据文档,OData应该只返回直接查询的实体,除非传递$expand来获取相关实体。但对我来说,情况并非如此。我有一个端点来获取子实体,但即使未传递$expand,它也会返回父数据 我该如何阻止这种情况发生?我想要有记录的行为: /api/Child?$top=10返回前10个子实体 /api/Child?$top=10&$expand=Parent返回前10个子实体并包含父数据 我正在Visual Studio 2015的.NET 4.6.1上使用Web Api 2.2和EntityFrame

根据文档,OData应该只返回直接查询的实体,除非传递$expand来获取相关实体。但对我来说,情况并非如此。我有一个端点来获取子实体,但即使未传递$expand,它也会返回父数据

我该如何阻止这种情况发生?我想要有记录的行为:

/api/Child?$top=10
返回前10个子实体

/api/Child?$top=10&$expand=Parent
返回前10个子实体并包含父数据

我正在Visual Studio 2015的.NET 4.6.1上使用Web Api 2.2和EntityFramework 6.1.3

控制器:

[ResponseType(typeof(IQueryable<Child>))]
[EnableQuery]
public IQueryable<Child> Get()
{
    return _repo.GetChildren();
}
点击端点/api/Child?$top=1返回:

"value": [
    {
      "ChildId": 1,
      "Name": "(child name)",
      "ParentId": 3387,
      "Parent": {
         "ParentId": 3387,
         "ParentName": "(parent name)",
         "DateUpdated": "2017-06-23T11:42:06.013+01:00"
      }
    }
]

除非我要求返回父数据,否则如何阻止它返回父数据?

首先让我们看看DbContext生成的SQL

为此,只需在“上下文”构造函数中添加以下行:

this.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
如果您的SQL包含一个到“父”表的“连接”,那么您的实体将被急切地加载。。。我会检查您的数据层或上下文,看看您是否包括父实体

... Context.Child.Include(s => s.Parent)

我重新创建了您的场景,是的,它应该按照您的预期工作。

我记录了SQL,实际上它很懒地一个接一个地加载每个父实体。奇怪的是,我尝试将.Include()添加到另一个实体中,而其中一个OData没有返回包含的实体。它似乎在做与我认为它应该做的完全相反的事情。今天早上我还遇到了EntityFramework的奇怪问题,我在两个不可为null的列之间添加了一个关联(在数据库和EF中它们都不为null),EF未能编译,因为它说存在可为null的依赖项。我不知道它有什么问题。通过进入存储库代码,看起来可能是OData出了问题,因为在创建查询对象时,它有正确的连接(或没有连接),但当SQL实际运行时,它会更改为错误的查询。我想我已经在这里找到了行为模式,但没有更明智的方法阻止它这么做。父类没有终结点。如果没有定义端点,OData似乎会扩展所有相关实体。如果我添加ParentsController并将builder.EntitySet添加到WebApiConfig,则Child将不再返回父数据,而不会被要求返回。如果我从WebApiConfig中删除builder.EntitySet,子级将再次返回父级数据。因此,我可以重现这个问题,但我没有设法阻止它。我尝试使用.hasportional(c=>c.Parent),它确实删除了父数据,但是如果我尝试通过/Child(1)/Parent获取父数据,我会得到一个406错误。我可以看到代码在ChildController.GetParentFromChild()中遇到断点,这是导航属性的命名约定,但在返回IQuerable后,响应变为406不可接受。
this.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
... Context.Child.Include(s => s.Parent)