原文地址:http://blog.csdn.net/rickykay/article/details/51680619
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
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
这个视图无法映射 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
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
这样视图就会多出 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 的实体。
浙公网安备 33010602011771号