【问题标题】:Entity Framework code-first: querying a view with no primary key实体框架代码优先:查询没有主键的视图
【发布时间】:2015-09-08 08:22:05
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


【解决方案1】:

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

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

如果不可能,则有一种解决方法,如果只是一个可查询的视图,则无需对检索到的值执行其他操作,例如删除或更新。修改视图以添加 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; }

并将新属性配置为主键。

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

【讨论】:

  • 感谢您的回复,但正如我所说,我无权更改视图,所以我正在寻找某种可以解决问题的 hack 或原始 sql 查询 :)
  • var 结果 = entityContext.Database.SqlQuery("SELECT NEWID(), MyView.* FROM MyView").ToList();在 MyEntity 上未定义键的相同问题,可能是我应该使用非实体类型,如元组
  • 您是否将主键添加到您的模型并设置为主键?
  • 奇怪,我得到 ORA-00955:名称已被现有对象使用,而且我使用 Oracle 数据库是 newid 在 oracle 中也可以工作,我不确定
  • 是的,例如Select SYS_GUID() As ID, ...,您必须将列重命名为模型中的相同名称。
【解决方案2】:

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

Number(9) 而不是 Number,使用 CAST 得到你想要的类型

然后添加一个禁用的主键约束。除了被实体框架识别为键之外,它不会做任何事情

alter view emp_view add constraint vemp_pk primary key (empno) disable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 2013-01-15
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多