Entity Framework(EF)无法对没有主键的视图映射实体

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 常量值

备注

  1. 要将数据库的一个视图映射为 Entity Framework 的实体,一定要确保该视图中有一列值是唯一的且是 not null 的就可以。
  2. ISNULL 函数的第二个参数是一个常量,如:5757E7EF-2F19-4408-B413-8F1B33B9895F,这样 Sql Server 才可以判断出该列的值肯定不为 null。否则该列仍未可以 null,最后依然无法映射 EF 的实体。

你可能感兴趣的:(Web,开发笔记)