Entity Framework(EF)无法对没有主键的视图映射实体
在使用 Entity Framework 的时候经常会把数据库中的某一个视图映射为EF的实体,但是如果数据库视图中的列没有包含表的主键列,EF会报出警告说视图没有主键,导致视图映射为实体失败,错误如下:
表/视图“{0}”未定义主键,无法推断有效的主键。已排除该表/视图。要使用该实体,您将需要检查架构,添加正确的键并对它取消注释。
English translation: The table/view ‘{0}’ does not have a primary key defined and no valid primary key could be inferred. This table/view has been excluded. To use the entity you will need to review your schema, add the correct keys and uncomment it.
解决办法
在视图里使用 Sql 的 ISNULL
函数生成一列值不能为 null
的列就行了。
比如原有视图为
CREATE VIEW [dbo].[ViewName]
AS
SELECT Column1, Column2, Column3, Column4, Column5
FROM dbo.TableName
这个视图无法映射 EF 视图,可以修改视图增加一个自动生成 GUID
值得列 Id_ColumnName
,并且使用 ISNULL
函数确保值不可为空,代码如下:
CREATE VIEW [dbo].[ViewName]
AS
SELECT ISNULL(NEWID(),'Guid_Value') AS Id_ColumnName, Column1, Column2, Column3, Column4, Column5
FROM dbo.TableName
这样视图就会多出 Id_ColumnName
列,并且是 not null
的。这样就可以在 EF 里映射为实体了。
注
字段名 | 解释 |
---|---|
ViewName | 视图名称 |
Column1~N | 列名称 |
TableName | 表名称 |
Id_ColumnName | 新主键列名称 |
Guid_Value | 常量值 |
备注
- 要将数据库的一个视图映射为 Entity Framework 的实体,一定要确保该视图中有一列值是唯一的且是
not null
的就可以。 ISNULL
函数的第二个参数是一个常量,如:5757E7EF-2F19-4408-B413-8F1B33B9895F,这样 Sql Server 才可以判断出该列的值肯定不为null
。否则该列仍未可以null
,最后依然无法映射 EF 的实体。