Silverlight WCF RIA服务从SQL View vs SQL Table中选择

时间:2012-11-20 14:14:04

标签: wcf-ria-services silverlight-5.0

我通过一条曲折而令人沮丧的路线走到了这个两难境地,但我会从现在的位置开始。有关信息,我使用的是VS2010,Silverlight 5以及最新版本的Silverlight和RIA Toolkits,SDK等。

我在我的数据库中有一个视图(它实际上现在是一个索引视图,但这对行为没有任何影响)。出于测试目的(包括测试我的理智),我将视图复制为表(即相同的列名和定义),并将所有视图行插入表中。因此,如果我从查询分析器中的视图或表中选择SELECT *,则会得到相同的结果。到目前为止一切都很好。

我在Silverlight业务应用程序Web项目中创建了一个EDF模型,包括所有对象。

我根据模型创建域服务,并为View和Table以及关联的Query对象创建ContextTypes和元数据。

如果我通过Table Query在Silverlight项目中填充Silverlight ListBox,它将返回表中的所有数据。

如果我通过View Query填充相同的ListBox,它只返回一行,始终是集合中的第一行,但是它是有序的。实际上,如果我通过调试器深入研究内部工作,当它在服务中执行ObjectContext查询时,它返回正确行数的结果集,但所有行都是相同的!如果我按顺序升序,我会得到第一行的n份副本,下降我得到最后一行的n份副本。

任何人都可以让我摆脱困境,并告诉我为什么View不起作用?

Ade

1 个答案:

答案 0 :(得分:2)

好的,这是可以预测的 - 几乎每当我在一个论坛上提问时,我都会在等待响应的时候偶然发现答案!

尽管已经通过元数据和model.designer文件并确保所有“视图”和“表”类/方法定义等都相同,但它仍然显示了视图和表查询之间行为的恼人差异。所以问题只是由数据库造成的,对吗?

果然,当我创建视图的“相同”表格版本时,我没有注意到自己创建了NOT NULL列!即使我使用SELECT NEWID()在视图上创建一个唯一的键列,数据库仍然坚持视图中的ID列是NULLABLE,显然这导致了问题。

为了节省一些存储空间,我使用NEWID()切换到使用ROW_NUMBER()来创建我的键列,但仍然存在“NULLABLE”属性问题。所以我把它改成了

SELECT ISNULL(ROW_NUMBER()(OVER ...), - 1)

表示ID列,最后视图中的列创建为NOT NULL!尽管NEWID()和ROW_NUMBER()都不能生成NULL输出,但似乎你必须握住SQL Server,并在它相信自己之前使用ISNULL运算符来保证它。

完成此操作后,删除/重新创建了我的模型和服务文件,一切都突然变成了光彩夺目的技术生活,没有任何手动添加[Key()]属性或其他任何东西。问题始终存在于数据库中,而不是模型/服务/元数据定义。

希望这能节省一些时间。现在我需要做的就是弄清楚为什么我两天前开始的原始存储过程方法不起作用 - 但至少我现在有一个提示!

阿德