一、前言
在做項目的時候,需要訪問一個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,結果完全不同;