Asp.net core 2.踩坑记录(二)使用EFCore连接Oracle
一、前言
在做项目的时候,需要访问一个Oracle数据库查询信息,因为之前都是用sqlserver,对oracle一脸蒙蔽,尤其是使用vs连接oracle,没用过,然后就在网上一顿查询。
以下为本人吐槽:不喜欢看的直接跳过,看解决方案。
哎,乱七八糟的一大堆,介绍的又繁琐、又晦涩难懂。。。。这还是宇宙第一ide的风格?连接一个数据库还需要如此麻烦?太不符合了一切从简的原则了,百度最多出现的就是以下解决方案:
1、下载Oracle Developer Tools for Visual Studio 2017
这第一步就够让我不爽了,什么?我连接一个数据库还要专门下载一个数据库管理工具?还只能为VS2017服务?哎,还是冷着头皮下载了。。。
2、然后我又换了搜索关键词,搜索“asp.net core连接oracle”,本来搜索的是vs连接oracle,现在出现的另一种解决方案,看似简单一些,不用下载软件还是驱动拉,如下操作:
1. ODP.NET Core 18.3或者更高
2.Microsoft.EntityFrameworkCore.Relational 2.1或者更高
3.Access to Oracle Database 11g Release 2 (11.2) 或者更高
结论:无语- - 用得着这么麻烦吗?我还是不放弃,继续寻找更简便的方法,终于!!!参考地址:https://www.cnblogs.com/NemoWork/p/11013597.html
我得到了最简单的使用efcore连接oracle方法。。。啥也不用下载,只需要安装一个nuget包,下边介绍具体步骤:
二、最简单的解决方案
1、开发环境
VS2017 / Aspnetcore2.2 / Oracle11.2
2、下载nuget包:Oracle.EntityFrameworkCore
没错,就是这么一个简简单单的包,就搞定 了!!!
3、新建数据库上下文:下面贴代码
using Database.Models.OracleModels; using Microsoft.EntityFrameworkCore; namespace Database.DbContextFile { public class MJKDbContext : DbContext { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseOracle(@"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.140.19)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)));Persist Security Info=True;User ID=rfxmujuku;Password=rfx", b => b.UseOracleSQLCompatibility("11")); } public DbSet<BT_MJInfo> MJInfo { get; set; } } }
这里对以上代码进行简要说明: 在重写方法OnConfiguring中,UseOracle的第一个参数为数据库连接字符串,这种写法支持远程连接数据库(本次项目就是远程连接服务器,还有另外一种极简写法就是直接写后边的那些账号密码啥的,据说极简写法只支持本地连接数据库,这点我没有验证,懒~),第二个参数为指定了数据库的版本(服务器的oracle版本为11就写11,为12就写12,据说是如果这里不指明版本,可能会有异常,我也没验证~懒);
下面的实体MJInfo就是数据库中的表啦,实体定义如下:
using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace Database.Models.OracleModels { [Table("MODEL_INFO")] public class BT_MJInfo { [Key] public string MJ_ID { get; set; } public string PRODUCT_NUM { get; set; } public Int16 MJ_NUM { get; set; } public Int16 MJ_ISUSED { get; set; } } }
4、直接使用:下面举个最简单的例子,查询语句,就是普通的ef用法!到此完事~
using (var db = new MJKDbContext()) { var count = db.MJInfo.Where(x => x.PRODUCT_NUM == "AA-0321C5").Count(); }
5、这里有个补充说明:在oracle某些版本中,不支持主键自增,所以在使用insert的时候,可能会报错,需要你手动赋予主键值,如果出现这个问题的话,起码心里有数,可以再去百度有针对性的搜索解决方案。
三、总结
哎~明明如此简单的操作,我愣是费了半天的功夫- - ,究其原因是没有最先搜索到有用的东西,我是想用EFCore连接oracle,就应该直接搜索EFCore连接oracle,而不应是搜索vs连接oracle,结果完全不同;