身份映射到具有实体框架的视图

时间:2017-05-17 02:08:57

标签: sql-server asp.net-mvc entity-framework

这是一个很常见的问题:您的视图不包含主键标识符,甚至不包含任何列的组合,以确保每一行都是唯一的。并且您希望在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()无法可靠地唯一标识视图中的每一行。

(现在,可以说这是对视图的滥用,它应该直接指向一个表,但是使用视图可能有很多原因,例如联合来自多个源的数据)。

此问题是否有解决方案或解决方法?

0 个答案:

没有答案
相关问题