我们的客户可以访问未定义主键的视图。我知道实体框架需要一个主键供表识别。
但是对于没有主键的视图,仍然可以查询。
我尝试查找,但是实体框架总是给出错误提示:
错误:EntityType’ViewWeight’没有定义键。定义此EntityType的键。
我知道键对于表很重要,但是对于仅读取的视图来说,有任何hack或方法可以读取值而无需修改视图本身。
在实体框架中,没有主键的实体是不可能的。
尝试从视图中获取可能的唯一键,组合各列,以创建唯一的主键。
如果不可能,则有一种解决方法,如果只是一个可查询的视图,则无需使用检索到的值(例如删除或更新)执行其他操作。将视图修改为add NEWID(),它将为每一行生成唯一的GUID ID,将此新列用作实体的主键。
NEWID()
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; }
并将新属性配置为主键。
但是要小心,因为没有这种代码的编译检查。