C# 设置某些实体页面大小时,WCF Data Services Expand的行为会意外

C# 设置某些实体页面大小时,WCF Data Services Expand的行为会意外,c#,entity-framework,odata,wcf-data-services,C#,Entity Framework,Odata,Wcf Data Services,在为生产准备WCF数据服务时,我们遇到了启用分页时expand操作符的行为问题 禁用分页后,按预期展开works。但是,当我在任何扩展的实体集上启用分页时,无论页面大小如何,扩展的实体显示为大小为1的页面 [更新] 在这里或MSDN论坛没有任何进一步的输入的情况下,我创建了一个。也许有人会翻墙,把它弄到底 例如,假设我有以下简单模型: 它在生成的SQL数据库上运行,其中包含一些示例数据: INSERT INTO [dbo].[Towns] (Name) VALUES ('Berlin'); I

在为生产准备WCF数据服务时,我们遇到了启用分页时expand操作符的行为问题

禁用分页后,按预期展开works。但是,当我在任何扩展的实体集上启用分页时,无论页面大小如何,扩展的实体显示为大小为1的页面

[更新]

在这里或MSDN论坛没有任何进一步的输入的情况下,我创建了一个。也许有人会翻墙,把它弄到底

例如,假设我有以下简单模型:

它在生成的SQL数据库上运行,其中包含一些示例数据:

INSERT INTO [dbo].[Towns] (Name) VALUES ('Berlin');
INSERT INTO [dbo].[Towns] (Name) VALUES ('Rome');
INSERT INTO [dbo].[Towns] (Name) VALUES ('Paris');

INSERT INTO [dbo].[Gentlemen] (Id, Name) VALUES (1, 'Johnny');

INSERT INTO [dbo].[Ladies] (Name, Town_Name, Gentleman_Id) VALUES ('Frieda', 'Berlin', 1);
INSERT INTO [dbo].[Ladies] (Name, Town_Name, Gentleman_Id) VALUES ('Adelita', 'Berlin', 1);
INSERT INTO [dbo].[Ladies] (Name, Town_Name, Gentleman_Id) VALUES ('Milla', 'Berlin', 1);
INSERT INTO [dbo].[Ladies] (Name, Town_Name, Gentleman_Id) VALUES ('Georgine', 'Paris', 1);
INSERT INTO [dbo].[Ladies] (Name, Town_Name, Gentleman_Id) VALUES ('Nannette', 'Paris', 1);
INSERT INTO [dbo].[Ladies] (Name, Town_Name, Gentleman_Id) VALUES ('Verona', 'Rome', 1);
INSERT INTO [dbo].[Ladies] (Name, Town_Name, Gentleman_Id) VALUES ('Gavriella', 'Rome', 1);
数据服务非常简单(请注意,此处禁用了分页):

当我运行这个查询(JSON,因为Atom版本非常庞大)时,我得到了预期的输出;一个有三位女士的小镇,所有人都以约翰尼为绅士

var result = {
        "d": {
            "__metadata": {
                "uri": "http://localhost:62946/TestWCFDataService.svc/Towns('Berlin')", "type": "TestModel.Town"
            }, "Name": "Berlin", "Ladies": [
    {
        "__metadata": {
            "uri": "http://localhost:62946/TestWCFDataService.svc/Ladies(1)", "type": "TestModel.Lady"
        }, "Id": 1, "Name": "Frieda", "Gentleman": {
            "__metadata": {
                "uri": "http://localhost:62946/TestWCFDataService.svc/Gentlemen(1)", "type": "TestModel.Gentleman"
            }, "Id": 1, "Name": "Johnny", "Ladies": {
                "__deferred": {
                    "uri": "http://localhost:62946/TestWCFDataService.svc/Gentlemen(1)/Ladies"
                }
            }
        }, "Town": {
            "__deferred": {
                "uri": "http://localhost:62946/TestWCFDataService.svc/Ladies(1)/Town"
            }
        }
    }, {
        "__metadata": {
            "uri": "http://localhost:62946/TestWCFDataService.svc/Ladies(2)", "type": "TestModel.Lady"
        }, "Id": 2, "Name": "Adelita", "Gentleman": {
            "__metadata": {
                "uri": "http://localhost:62946/TestWCFDataService.svc/Gentlemen(1)", "type": "TestModel.Gentleman"
            }, "Id": 1, "Name": "Johnny", "Ladies": {
                "__deferred": {
                    "uri": "http://localhost:62946/TestWCFDataService.svc/Gentlemen(1)/Ladies"
                }
            }
        }, "Town": {
            "__deferred": {
                "uri": "http://localhost:62946/TestWCFDataService.svc/Ladies(2)/Town"
            }
        }
    }, {
        "__metadata": {
            "uri": "http://localhost:62946/TestWCFDataService.svc/Ladies(3)", "type": "TestModel.Lady"
        }, "Id": 3, "Name": "Milla", "Gentleman": {
            "__metadata": {
                "uri": "http://localhost:62946/TestWCFDataService.svc/Gentlemen(1)", "type": "TestModel.Gentleman"
            }, "Id": 1, "Name": "Johnny", "Ladies": {
                "__deferred": {
                    "uri": "http://localhost:62946/TestWCFDataService.svc/Gentlemen(1)/Ladies"
                }
            }
        }, "Town": {
            "__deferred": {
                "uri": "http://localhost:62946/TestWCFDataService.svc/Ladies(3)/Town"
            }
        }
    }
    ]
        }
    }
最终将有许多
城镇
,因此我启用了城镇分页

...
            config.SetEntitySetPageSize("Towns", 10);
...
查询继续按预期运行。但是也会有很多
女士
男士
,因此我希望能够限制返回结果的数量:

...
            config.SetEntitySetPageSize("Ladies", 10);
            config.SetEntitySetPageSize("Gentlemen", 10);
...
但是,当我在Ladies实体集或Genties实体集(或两者)上设置页面大小时,查询结果会意外更改:

var result = {
    "d": {
        "__metadata": {
            "uri": "http://localhost:62946/TestWCFDataService.svc/Towns('Berlin')", "type": "TestModel.Town"
        }, "Name": "Berlin", "Ladies": {
            "results": [
{
    "__metadata": {
        "uri": "http://localhost:62946/TestWCFDataService.svc/Ladies(1)", "type": "TestModel.Lady"
    }, "Id": 1, "Name": "Frieda", "Gentleman": {
        "__metadata": {
            "uri": "http://localhost:62946/TestWCFDataService.svc/Gentlemen(1)", "type": "TestModel.Gentleman"
        }, "Id": 1, "Name": "Johnny", "Ladies": {
            "__deferred": {
                "uri": "http://localhost:62946/TestWCFDataService.svc/Gentlemen(1)/Ladies"
            }
        }
    }, "Town": {
        "__deferred": {
            "uri": "http://localhost:62946/TestWCFDataService.svc/Ladies(1)/Town"
        }
    }
}
]
        }
    }
}
展开仅包括一个Lady对象(尽管至少包括她的绅士)。不管页面大小设置为多大,查询仍然只返回扩展集合中的一个对象

页面大小是否在一个或两个扩展实体上设置也无关紧要,只要其中一个实体设置了页面大小,那么只有一个
Lady
对象会被急切地加载

我觉得这种行为有点不对劲,如:

“带有$expand System Query选项的URI表示与URI的资源路径部分标识的条目或条目集合相关联的条目必须以内联方式表示(即急切加载)。”

我是不是误读了说明书?我应该预料到这种行为吗?我只想在直接访问时能够限制实体集的页面大小,但也希望它们能够被加载

这是WCF数据服务中的一个bug吗?(或者我的代码?或者我的大脑?)

[编辑]

更多信息:州政府:

此外,在数据服务中启用分页时,必须从服务中显式加载后续数据页

但是我找不到解释,为什么不管指定了什么页面大小,相关实体集的页面大小似乎默认为1

[编辑]

更多信息:所讨论的版本位于.NET 4版本
4.0.30319
System.Data.Services
version
4.0.0
。它是VisualStudio2010附带的版本(安装了SP1)

[编辑]


一个显示该行为的示例解决方案现在在一个应用程序中出现。它在
InitializeService
方法中打开了分页,并且有一个DB创建脚本,它还添加了一些示例数据,这样我们就可以在同一个页面上了。

您使用的是什么版本的WCF数据服务? 在.NET Framework 4中,我发现了一个与使用Expand with server driven paging相关的bug,但我认为它只影响具有复合键的实体,并且在使用OrderBy选项时,这两个选项在这里似乎都不适用。 不过,这听起来确实像一只虫子


您是否尝试过使用Atom而不是JSON,如果是,扩展中的实体是否仍然缺失?

您使用的是什么版本的WCF数据服务? 在.NET Framework 4中,我发现了一个与使用Expand with server driven paging相关的bug,但我认为它只影响具有复合键的实体,并且在使用OrderBy选项时,这两个选项在这里似乎都不适用。 不过,这听起来确实像一只虫子

您是否尝试过使用Atom而不是JSON,如果是,扩展中的实体是否仍然丢失?

您的查询: localhost:62946/TestWCFDataService.svc/Towns('Berlin')?$expand=女士/男士

不扩大女士的范围,只扩大绅士的范围

查询应该如下所示:

localhost:62946/TestWCFDataService.svc/Towns('Berlin')?$expand=女士、女士/绅士

希望这有帮助

Monica Frintu

您的问题: localhost:62946/TestWCFDataService.svc/Towns('Berlin')?$expand=女士/男士

不扩大女士的范围,只扩大绅士的范围

查询应该如下所示:

localhost:62946/TestWCFDataService.svc/Towns('Berlin')?$expand=女士、女士/绅士

希望这有帮助


Monica Frintu花了几个月的时间,但这将在下一个版本中修复:

微软于2011年12月15日上午8:08发布

感谢您报告此问题。我们已经确认实体框架中的一个bug是 造成这个问题。该修复需要对发布的核心实体框架组件进行更改 在.NET框架中。我们已经修复了该bug,该修复将包含在的下一版本中 NET框架


这花了几个月的时间,但这将在下一个版本中修复:

微软于2011年12月15日上午8:08发布

感谢您报告此问题。我们已经确认实体框架中的一个bug是 造成这个问题。该修复需要对发布的核心实体框架组件进行更改 在.NET框架中。我们已经修复了该bug,该修复将包含在的下一版本中 NET框架


.NET 4,来自上一个Service Pack。实际上,我们通常使用Atom来实现这一点,我只是使用JSON来发布示例,因为它更简洁..NET4,来自上一个Service Pack。实际上,我们通常使用Atom,我只是使用JSON
...
            config.SetEntitySetPageSize("Ladies", 10);
            config.SetEntitySetPageSize("Gentlemen", 10);
...
var result = {
    "d": {
        "__metadata": {
            "uri": "http://localhost:62946/TestWCFDataService.svc/Towns('Berlin')", "type": "TestModel.Town"
        }, "Name": "Berlin", "Ladies": {
            "results": [
{
    "__metadata": {
        "uri": "http://localhost:62946/TestWCFDataService.svc/Ladies(1)", "type": "TestModel.Lady"
    }, "Id": 1, "Name": "Frieda", "Gentleman": {
        "__metadata": {
            "uri": "http://localhost:62946/TestWCFDataService.svc/Gentlemen(1)", "type": "TestModel.Gentleman"
        }, "Id": 1, "Name": "Johnny", "Ladies": {
            "__deferred": {
                "uri": "http://localhost:62946/TestWCFDataService.svc/Gentlemen(1)/Ladies"
            }
        }
    }, "Town": {
        "__deferred": {
            "uri": "http://localhost:62946/TestWCFDataService.svc/Ladies(1)/Town"
        }
    }
}
]
        }
    }
}