1

我是通过一条曲折而令人沮丧的路线到达这个困境的,但我将从我现在所处的位置开始。有关信息,我正在使用 VS2010、Silverlight 5 以及最新版本的 Silverlight 和 RIA 工具包、SDK 等。

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

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

我基于模型创建了一个域服务,它为视图和表以及关联的查询对象创建了上下文类型和元数据。

如果我通过表查询在我的 Silverlight 项目中填充一个 Silverlight 列表框,它会返回表中的所有数据。

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

谁能把我从这里的痛苦中解脱出来,并告诉我为什么 View 不起作用?

阿德

4

1 回答 1

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()] 属性或其他任何东西,一切都迸发出了光彩夺目的色彩生活。问题一直出在数据库上,而不是模型/服务/元数据定义。

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

阿德

于 2012-11-20T15:52:04.837 回答