这是一个很常见的问题:您的视图不包含主键标识符,甚至不包含任何列的组合,以确保每一行都是唯一的。并且您希望在Entity Framework中使用此视图。你做什么的?
您修改视图以添加生成的主键是suggested,例如:
SELECT row_number() OVER(ORDER BY Activity) AS ID, * FROM MyView
但是,由于Activity
不是唯一的,因此每次查询视图时,生成的标识符都会更改。
考虑以下具有视图的场景:
Activity CustomerName Cost
Skiing John 81.50
Skydiving Sarah 199.99
Skydiving Robert 215.00
并在ID
上添加Activity
列:
ID Activity CustomerName Cost
1 Skiing John 81.50
2 Skydiving Sarah 199.99
3 Skydiving Robert 215.00
现在假设用户在网页上请求此视图。
不久之后,其他人添加了滑雪板预订,导致视图变为:
ID Activity CustomerName Cost
1 Snowboarding Michael 85.00
2 Skiing John 81.50
3 Skydiving Sarah 199.99
4 Skydiving Robert 215.00
第一个用户希望查看有关Sarah跳伞预订的更多详细信息,因此他从页面中选择该行并使用ID = 2
发送新请求。但是自从他加载页面后,支持视图已经改变,现在ID = 2
指的是John的滑雪预订,导致加载了错误的信息。
故事的寓意:row_number()
无法可靠地唯一标识视图中的每一行。
(现在,可以说这是对视图的滥用,它应该直接指向一个表,但是使用视图可能有很多原因,例如联合来自多个源的数据)。
此问题是否有解决方案或解决方法?