OData客户端未使用$expand重新水合

OData客户端未使用$expand重新水合,odata,Odata,我使用OData已经有一段时间了,我发现它是一个设置服务器的绝佳工具。今天我遇到了一些我以前从未见过的东西,这让我非常困惑 我正在使用客户端上的.Expand来请求获取报表时的数据树。我在原型中使用了精确的查询,它工作得非常好(即完全水合)。当我使用Fiddler发送查询时,响应包是完美的,包含了我要查找的所有数据 问题是,客户没有对任何扩展属性进行水合处理(当前服务的服务参考完全是最新的)。为了试着弄清楚到底发生了什么,我把范围缩小到了一个单独的属性,但它仍然不起作用 var report =

我使用OData已经有一段时间了,我发现它是一个设置服务器的绝佳工具。今天我遇到了一些我以前从未见过的东西,这让我非常困惑

我正在使用客户端上的.Expand来请求获取报表时的数据树。我在原型中使用了精确的查询,它工作得非常好(即完全水合)。当我使用Fiddler发送查询时,响应包是完美的,包含了我要查找的所有数据

问题是,客户没有对任何扩展属性进行水合处理(当前服务的服务参考完全是最新的)。为了试着弄清楚到底发生了什么,我把范围缩小到了一个单独的属性,但它仍然不起作用

var report = (serviceContext.Reports.Expand("ReportAreas").Where(r=>r.ReportID==reportID)).SingleOrDefault();
提供报告,但ReportAreas包含0项。如果我尝试:

serviceContext.LoadProperty(report,"ReportAreas");
然后ReportAreas包含20个左右的项

这简直让我发疯,因为Expand处理的是不同的对象树(不同的查询,但功能代码相同),一点问题都没有。有没有人建议我怎样才能搞清楚这里到底发生了什么

更新:

今天关于这一点的一些新信息可能更为复杂,并向我建议OData客户端中存在一个bug。我发现只有一部分报表对象返回,而没有填充扩展属性。数据库中的大多数报告都非常好。也就是说,如果我请求所有扩展了ReportAreas的报告(而不是细化为单个reportID),大约80-90%的报告区域计数为非零,而其余的报告区域计数为0

当报表返回时,没有填充任何属性(null或0 count),实际的属性对象将被实例化,它们的属性将被设置(从服务引用的Reference.cs文件中的断点),例如ReportID,在查询解析期间,属于ReportArea对象的PropertyAreaID和历史记录值设置了16次,但请求ReportAreas列表时,其计数为0。当我使用_service.LoadProperty时,它返回16个ReportAreas


在我看来,Expand查询中有引用不匹配的味道,但它太一致了,不可能是一个简单的问题。有效的报告总是有效的,无效的报告永远不会有效。真的希望有人能帮我找出这个问题,这样我就可以继续使用一些有用的编码…

这个问题的解决方案(至少在我更好地理解它之前)是设置

serviceContext.MergeOption = MergeOption.OverwriteChanges;

我被告知,这与客户没有重新水化链接有关,如果他们已经被跟踪。如果我发现更多/更好地理解问题,我将更新此答案。

此问题的解决方案(至少在我更好地理解之前)是设置

serviceContext.MergeOption = MergeOption.OverwriteChanges;

我被告知,这与客户没有重新水化链接有关,如果他们已经被跟踪。如果我发现更多/更好地理解问题,我会更新此答案。

你能试试Fiddler,看看向服务器发送了什么查询(URL)以及响应是否包含扩展数据。根据第2段“当我使用Fiddler发送查询时,响应包是完美的(即包含所有扩展数据)”我理解,当您从Fiddler手动发送请求时,它可以正常工作。我在问你是否可以使用Fiddler来查看客户端应用程序发送的请求,特别是请求的URL和响应。。。现在没有时间检查。我明天早上第一件事就是去做。好吧,因为我怀疑请求和响应似乎是完美的。唯一没有发生的事情是对象作为对象图的一部分出现。我可以用service.Property(,)填充每个属性,但这需要大约30秒。你能试试Fiddler,看看向服务器发送了什么查询(URL)以及响应是否包含扩展数据。根据第2段“当我使用Fiddler发送查询时,响应包是完美的(即包含所有扩展数据)”我理解,当您从Fiddler手动发送请求时,它可以正常工作。我在问你是否可以使用Fiddler来查看客户端应用程序发送的请求,特别是请求的URL和响应。。。现在没有时间检查。我明天早上第一件事就是去做。好吧,因为我怀疑请求和响应似乎是完美的。唯一没有发生的事情是对象作为对象图的一部分出现。我可以用service.Property(,)填充每个属性,但这需要大约30秒。请参阅“默认情况下,客户端仅将响应提要中的条目具体化到DataServiceContext尚未跟踪的实体的对象中。这意味着对缓存中已有对象的更改不会被覆盖。此行为通过为查询和加载操作指定MergeOption值来控制。“这与初始问题无关。即使特定对象以前已由上下文加载(它们没有加载)我仍然希望它们出现在ReportAreas集合中。否则,数据库的引用完整性将被完全抛出,因为当我从服务器加载时,由于这些对象在客户端上“不存在”,我可能会尝试重新插入服务器上已经存在的对象。请参阅“默认情况下,对于DataServiceContext尚未跟踪的实体,客户端仅将响应提要中的条目具体化到对象中。这意味着对缓存中已有对象的更改不会被覆盖。此行为通过为查询和加载操作指定MergeOption值来控制。“这与初始问题无关。即使特定对象以前已由上下文加载(它们没有加载),我仍然希望它们出现在ReportAreas集合中。否则,数据的引用完整性