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,结果完全不同;

    

原文地址:https://www.cnblogs.com/4job/p/11584675.html