Entity Framework 无法对没有主键的视图映射实体的解决办法
来源:互联网 发布:中华软件 编辑:程序博客网 时间:2024/05/17 07:18
我们在使用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的列就行了。
比如假设现在我们的数据库中本来有一个视图叫V_Customer,它返回的列中没有包含查询表dbo.CustomersBoughtCarsSurvey的主键列,其Sql脚本如下:
CREATE VIEW [dbo].[V_Customer]ASSELECT Name, Age, Sex, Nation, CityFROM dbo.CustomersBoughtCarsSurvey
那么这个视图是无法映射为Entity Framework的实体的,现在我们修改视图增加一个自动生成GUID值的列叫Id,并且使用ISNULL函数确保该列值不为空,脚本如下:
CREATE VIEW [dbo].[V_Customer]ASSELECT ISNULL(NEWID(), 'd1e57ca7-6eee-495a-be13-73d5e7d51f36') AS Id, Name, Age, Sex, Nation, CityFROM dbo.CustomersBoughtCarsSurvey
我们可以看到现在在视图中多了一列id,且是not null的,现在Entity Framework就可以将上面这个视图映射为实体了,并且自动将列Id映射为了实体键
所以如果要将数据库的一个视图映射为Entity Framework的实体,一定要确保该视图中有一列值是唯一的且是not null的就可以了!
另外要注意sql的isnull函数第二个参数一定要设置为一个常量视图才认为这列是not null的,比如本例中我们在视图中自定义的列Id是ISNULL(NEWID(), 'd1e57ca7-6eee-495a-be13-73d5e7d51f36') AS Id,isnull函数的第二个参数是写的一个GUID的常量值'd1e57ca7-6eee-495a-be13-73d5e7d51f36',这样SqlServer就会判定列Id肯定不会是null,所以视图定义中最后才会显示列Id是not null的。
但是如果你将isnull第二个参数定义为一个不确定的值比如一个函数像这样ISNULL(NEWID(), NEWID()) AS Id那么最后SqlServer会认为即便列Id的值使用了isnull函数但是列Id还是有可能为null,所以列Id最后在视图定义中还是显示可以为null。最后该视图还是无法映射为Entity Framework的实体。
- Entity Framework 无法对没有主键的视图映射实体的解决办法
- Entity Framework 无法对没有主键的视图映射实体的解决办法
- (无法推断有效的主键。已排除该表/视图)Entity Framework 无法对没有主键的视图映射实体的解决办法
- Entity Framework(EF)无法对没有主键的视图映射实体
- Entity FrameWork 实体 视图 无主键 解决办法
- jpa映射entity(视图) 主键相等 的坑
- Entity Framework多对多关联映射的实现
- Entity Framework映射的总结
- Entity Framework多表对一实体,一表对多实体的实现
- Entity Framework 警告 6013 未定义主键,无法推断有效的主键的解决方法
- 关于hibernate反向生成实体类的问题-没有主键的表映射
- Hibernate 映射视图的联合主键
- Entity Framework中实体模型命名空间的问题
- 关于Entity Framework中自增主键的问题
- Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例
- Hibernate对视图的映射
- XML的实体--ENTITY
- hibernate 无主键的表映射实体类
- Java线程池
- 总结OnOK()、OnCancel()、OnClose()、OnDestroy()之间的区别(转)
- Eclipse插件开发之ActionSet分割符
- 一个程序员的Java和C++学习之路(整理)
- 在pc端,分享功能
- Entity Framework 无法对没有主键的视图映射实体的解决办法
- Mysql数据库导入Sqlite
- 视频会议及流媒体十大开源项目
- 经纬度如何在mysql 数据库中定义数据类型.
- equals 和 ==
- Ubuntu下配置samba服务器
- base64转换成pdf在页面显示
- [BZOJ1834]网络扩容 做题笔记
- 项目管理:CocoaPods建立私有仓库