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

时间:2015-06-22 18:43:35

标签: sql oracle entity-framework view ef-code-first

我们的客户已授予对没有定义主键的视图的访问权限。我知道实体框架需要一个主键来表识别。

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

我试图找到但实际上Entity Framework总是提出错误说:

  

错误:: EntityType'ViewWeight'没有定义键。定义此EntityType的密钥。

我理解密钥对于表很重要,但是对于只是读取的视图,有任何黑客或方法来读取值而不修改视图本身。

2 个答案:

答案 0 :(得分:5)

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

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

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

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

问题是如果每次为同一行获取不同的ID时重复相同的查询。

<强>更新

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

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

在你的模特中添加

public Guid ID { get; set; }

并将新属性配置为主键。

但要小心,因为没有使用这种代码进行编译检查。

答案 1 :(得分:0)

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

Number(9)而不是Number,使用CAST获取所需的类型

然后添加禁用的主键约束。除了被实体框架识别为关键

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