回答

收藏

实体框架优先代码:查询没有主键的视图

技术问答 技术问答 496 人阅读 | 0 人回复 | 2023-09-12

我们的客户可以访问未定义的主键视图。我知道实体框架需要一个主键供表识别。4 Y8 _( b7 t' [0 l/ t
但是没有主键的视图还是可以查询的。& e9 Z: l; g" J0 ~) O( {9 x. n
我试图找到它,但实体框架总是给出错误的提示:5 h7 G" f! o' R
错误:EntityType’ViewWeight’没有定义键。定义这个EntityType的键。$ G/ _! N# r' u0 P. ~- Y4 ^7 [! Q
我知道键对表很重要,但是对于只读取的视图,有什么hack或者方法可以在不修改视图本身的情况下读取值。
* s+ \, \- `. i  U0 p                                                                ) s+ [8 \9 ^& n2 F/ m) F8 E
    解决方案:                                                               
7 a3 u) E5 h3 A                                                                没有主键的实体是不可能的。: o4 e- T8 q  t! V; G
试着从视图中获得可能的唯一键,组合每列,创建唯一的主键。
2 E, K; A( u  X+ y/ `2 i" o1 ^( F如果不可能,有一个解决方案。如果只是一个可查询的视图,则无需使用检索到的值(如删除或更新)执行其他操作。将视图修改为add# `9 c0 p) @& H% A' ]
NEWID(),它将为每一行生成唯一的GUID ID,新列作为实体的主键。8 v6 K/ Z" F# Z! v9 L9 \- ]
CREATE VIEW FooView AS    SELECT SELECT NEWID() AS ID,          COLUMN_A,          COLUMN_B     .....问题是,如果你每次在同一行得到不同的东西ID同样的查询总是重复。6 X' C7 t6 Y8 n
更新$ I2 I9 u( B4 k4 [  j7 C
如果不能修改视图,可以Entity与原始Sql一起使用,原始sql创建为
' r3 C5 Q" C  VList myViewItems = context.MyView.SqlQuery("SELECT NEWID() AS ID,MyView.* FROM MyView").ToList();添加到模型中! ^/ r0 k, Z2 M6 d( v# B4 B
public Guid ID { get; set; }并将新属性配置为主键。
( O  _; i1 d% ?但是要小心,因为没有编译检查这个代码。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则