Entity Framework 代码优先:查询没有主键的视图

Entity Framework code-first: querying a view with no primary key

我们的客户已授予访问未定义主键的视图的权限。我知道 Entity Framework 需要一个主键供 table 识别。

但是对于没有主键的view还是可以查询的

我试图找到但总是 Entity Framework 给出错误提示:

Error: : EntityType 'ViewWeight' has no key defined. Define the key for this EntityType.

我知道键对 table 很重要,但对于仅供阅读的视图,是否有任何技巧或方法可以在不修改视图本身的情况下读取值。

在 Entity Framework 中不可能有没有主键的实体。

尝试从视图中获取可能的唯一键,组合列,...以创建唯一的主键。

如果不可能,则有一个解决方法,如果只是一个可查询的视图,则不需要对检索到的值执行其他操作,例如删除或更新。修改视图以添加 NEWID() ,它将为每一行生成一个唯一的 GUID ID,使用这个新列作为您实体的主键。

CREATE VIEW FooView AS
    SELECT SELECT NEWID() AS ID,
           COLUMN_A,
           COLUMN_B
     .....

问题是,如果您每次都重复相同的查询,同一行会得到不同的 ID。

已更新

如果您不能不修改视图,您可以使用带有原始 Sql 的实体,创建原始 sql 为

List<MyView> myViewItems = context.MyView.SqlQuery("SELECT NEWID() AS ID, MyView.* FROM MyView").ToList();

在您的模型中添加

public Guid ID { get; set; }

并配置新的属性为主键。

但是要小心,因为这种代码没有编译检查。

我创建了包含主键的视图。确保视图中的所有字段都是特定数据类型:

Number(9) 而不是 Number,使用 CAST 获取您想要的类型

然后添加禁用的主键约束。除了被 entity framework 识别为密钥

外,它不会做任何事情
alter view emp_view add constraint vemp_pk primary key (empno) disable