一尘不染

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

sql

我们的客户可以访问未定义主键的视图。我知道实体框架需要一个主键供表识别。

但是对于没有主键的视图,仍然可以查询。

我尝试查找,但是实体框架总是给出错误提示:

错误:EntityType’ViewWeight’没有定义键。定义此EntityType的键。

我知道键对于表很重要,但是对于仅读取的视图来说,有任何hack或方法可以读取值而无需修改视图本身。


阅读 179

收藏
2021-05-30

共1个答案

一尘不染

在实体框架中,没有主键的实体是不可能的。

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

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

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

问题是,如果您每次在同一行中获得不同的ID时都重复相同的查询。

更新

如果您无法修改视图,则可以将Entity与原始Sql一起使用,将原始sql创建为

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

在模型中添加

public Guid ID { get; set; }

并将新属性配置为主键。

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

2021-05-30