我们的客户已授予对没有定义主键的视图的访问权限。我知道实体框架需要一个主键来表识别。
但是对于没有主键的视图,仍然可以查询。
我试图找到但实际上Entity Framework总是提出错误说:
错误:: EntityType'ViewWeight'没有定义键。定义此EntityType的密钥。
我理解密钥对于表很重要,但是对于只是读取的视图,有任何黑客或方法来读取值而不修改视图本身。
答案 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