Asp.net Core 3.1+EF Core2.2.6+Oracle.EntityFrameworkCore2.1.19连接Oracle数据库

1、前言

本次主要采用Asp.net core3.1来实现API服务(优势:跨平台),其中此技术比较新颖,其中连接Oracle遇到各种困难(特别是资料较少,各个插件版本比较多,且依赖的版本也有要求),经过各种尝试,最终可以连接上Oracle数据库,此处仅仅是demo。

2、技术路线

2.1 Asp.net core 3.1

ASP.NET Core 是一个跨平台的高性能开源框架,用于生成基于云且连接 Internet 的新式应用程序。 使用 ASP.NET Core,您可以:

1)创建 Web 应用程序和服务、IoT 应用和移动后端。

2)在 Windows、macOS 和 Linux 上使用喜爱的开发工具。

3)部署到云或本地。

4)在 .NET Core 或 .NET Framework 上运行。

为何选择 ASP.NET Core?

数百万开发人员使用过(并将继续使用)ASP.NET 4.x 创建 Web 应用。 ASP.NET Core 是重新设计的 ASP.NET 4.x,更改了体系结构,形成了更精简的模块化框架。

ASP.NET Core 具有如下优点:

1)生成 Web UI 和 Web API 的统一场景。

2)针对可测试性进行构建。

3)Razor Pages 可以使基于页面的编码方式更简单高效。

4)Blazor 允许你在浏览器中使用 C# 和 JavaScript。 共享全部使用 .NET 编写的服务器端和客户端应用逻辑。

5)能够在 Windows、macOS 和 Linux 上进行开发和运行。

6)开放源代码和以社区为中心。

7)集成新式客户端框架和开发工作流。

8)支持使用 gRPC 托管远程过程调用 (RPC)。

9)基于环境的云就绪配置系统。

10)内置依赖项注入。

11)轻型的高性能模块化 HTTP 请求管道。

12)能够托管于以下各项:Kestrel、IIS、HTTP.sys、Nginx、Apache、Docker

13)并行版本控制。

14)简化新式 Web 开发的工具。

2.2 Microsoft.EntityFrameworkCore2.2.6

Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术。

EF Core 可用作对象关系映射程序 (O/RM),以便于 .NET 开发人员能够使用 .NET 对象来处理数据库,这样就不必经常编写大部分数据访问代码了。

离线下载地址:https://www.nuget.org/packages/Oracle.EntityFrameworkCore/

2.3 Oracle.EntityFrameworkCore2.1.19

此插件主要是为了连接Oracle数据库;

依赖项:

Microsoft.EntityFrameworkCore.Relational (>= 2.1.11 && < 3.0.0)

Oracle.ManagedDataAccess.Core (>= 2.19.60 && < 2.20.0)

3、总结

在经过两天的尝试,最大的坑是此Oracle.EntityFrameworkCore2.1.19插件需要有依赖插件,并且版本要对,否则一直会报错;

3.1尝试Citms.EntityFrameworkCore.Oracle连接Oracle

其中会报错:System.TypeLoadException:“Method 'get_Info' in type 'Microsoft.EntityFrameworkCore.Oracle.Infrastructure.Internal.OracleOptionsExtension' from assembly 'Citms.EntityFrameworkCore.Oracle, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.”。

3.2尝试Oracle.ManagedDataAccess.Core连接Oracle

最终通过ASP.NET Core3.1通过EF Core连接Oracle,需要注意依赖项版本号问题。

4、源码

4.1实体

[Table("数据库中表名")]

    public class BaseEntity

    {

        [Column("表中字段")]

        public string Id { get; set; }

        [Column("表中字段")]

        public string Name { get; set; }

}

4.2 数据库上下文

    public class EntityOracleDBContext: DbContext

    {

        public static readonly LoggerFactory MyLoggerFactory

       = new LoggerFactory(new[] { new DebugLoggerProvider() });

        public EntityOracleDBContext(DbContextOptions<EntityOracleDBContext> options) : base(options)

        {

        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)

        {

           modelBuilder.Entity<BaseEntity>();

        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)

        {

            optionsBuilder

                .UseLoggerFactory(MyLoggerFactory);

        }

        public DbSet<BaseEntity> TodoItems { get; set; }

    }

4.3 Controller层

    [Route("api/[controller]")]

    public class EmployeeController : Controller

    {

        EntityOracleDBContext context;

        public EmployeeController(EntityOracleDBContext context)

        {

            this.context = context;

        }

        // GET: api/<controller>

        [HttpGet]

        public IEnumerable<string> Get()

        {

            List<BaseEntity> todoItems = context.TodoItems.ToList();

            return todoItems.Select(t=>t.Id);

        }

        // GET api/<controller>/5

        [HttpGet("{id}")]

        public string Get(string id)

        {

            BaseEntity todoItem = context.TodoItems.Find(id);

            return todoItem.Name;

        }

        // POST api/<contdroller>

        [HttpPost]

        public void Post([FromBody]string value)

        {

        }

        // PUT api/<controller>/5

        [HttpPut("{id}")]

        public void Put(int id, [FromBody]string value)

        {

        }

        // DELETE api/<controller>/5

        [HttpDelete("{id}")]

        public void Delete(int id)

        {

        }

    }

4.4 调取测试

https://localhost:5001/api/employee/927b582d-a897-4d7b-8cca-bd0c63386ad9

 

Asp.net core 3.1+EF Core2.2.6+Oracle.EntityFrameworkCore2.1.19连接Oracle数据库的更多相关文章

  1. asp.net core系列 30 EF管理数据库架构--必备知识 迁移

    一.管理数据库架构概述 EF Core 提供两种主要方法来保持 EF Core 模型和数据库架构同步.一是以 EF Core 模型为基准,二是以数据库为基准. (1)如果希望以 EF Core 模型为 ...

  2. asp.net core系列 31 EF管理数据库架构--必备知识 反向工程

    一.   反向工程 反向工程是基于数据库架构,生成的实体类和DbContext类代码的过程,对于Visual Studio开发,建议使用PMC.对于其他开发环境,请选择.NET Core CLI工具( ...

  3. Asp.net core下利用EF core实现从数据实现多租户(1)

    前言 随着互联网的的高速发展,大多数的公司由于一开始使用的传统的硬件/软件架构,导致在业务不断发展的同时,系统也逐渐地逼近传统结构的极限. 于是,系统也急需进行结构上的升级换代. 在服务端,系统的I/ ...

  4. Asp.net core下利用EF core实现从数据实现多租户(3): 按Schema分离 附加:EF Migration 操作

    前言 前段时间写了EF core实现多租户的文章,实现了根据数据库,数据表进行多租户数据隔离. 今天开始写按照Schema分离的文章. 其实还有一种,是通过在数据表内添加一个字段做多租户的,但是这种模 ...

  5. 在ASP.NET Core中通过EF Core实现一个简单的全局过滤查询

    前言 不知道大家是否和我有同样的问题: 一般在数据库的设计阶段,会制定一些默认的规则,其中有一条硬性规定就是一定不要对任何表中的数据执行delete硬删除操作,因为每条数据对我们来说都是有用的,并且是 ...

  6. asp.net core 系列 22 EF(连接字符串,连接复原,DbContext)

    一.连接字符串 在上二篇中,ASP.NET Core 应用程序连接字符串是写死在ConfigureServices代码中,下面介绍通过配置来实现.连接字符串可以存储在 appsettings.json ...

  7. asp.net core 系列 21 EF现有数据库进行反向工程

    一.概述 在上篇中使用EF基于数据模型创建数据库,  本篇继续使用 EF  基于数据库创建数据模型.  实现对已有数据库进行反向工程,来构建数据访问的 ASP.NET Core MVC 应用程序.已有 ...

  8. asp.net core 系列 20 EF基于数据模型创建数据库

    一.概述 本章使用 Entity Framework Core 构建执行基本数据访问的 ASP.NET Core MVC 应用程序.使用迁移(migrations)基于数据模型创建数据库,是一种cod ...

  9. ASP.NET Core 中使用EF Core 将实体映射到数据库表的方法(SQL Server)

    前段时间听过一个关于使用ASP.NET Core建立项目的视频.其中使用EF Core映射到数据库的部分是按部就班地学习.今天自己建立项目时,有些步骤已经有一些遗忘.所以写下这篇文章,顺便理清思路. ...

随机推荐

  1. PE可执行文件加载器

    PE文件加载器 模仿操作系统,加载pe文件到内存中 该项目主要是为了检测pe的学习程度,是否都完全理解了.当然没有完全理解 实现功能的如下: 模仿操作系统,加载pe文件到内存中,然后执行待执行的pe文 ...

  2. Unreal Engine 4 蓝图完全学习教程(二)—— 初步尝试

    本篇尝试使用蓝图.蓝图是使用专门的编辑器进行编程. Ⅰ.3类蓝图 ①关卡蓝图:前面提到过,关卡是指在UE中制成的游戏场景.关卡蓝图是用于制作当前游戏场景的程序.在UE中进行编程就是在创建关卡蓝图. ② ...

  3. Spring-cloud微服务实战【八】:API网关zuul

      在前面的文章中,我们先后使用了eureka/ribbon/feign/hystrix搭建了一个看似完美的微服务了,那是否还有值得继续优化的地方呢?答案肯定是有的,如果从整个微服务内部来看,基本已经 ...

  4. 编译出适合自己的nginx

    上面是解压后的nginx源码 auto目录 上面的cc目录用于编译,lib库 os目录对系统进行判断,其他所有文件都是辅助conf脚本执行 判定nginx支持哪些模块,当前操作系统有哪些特性. CHA ...

  5. 【C/C++】概念: VC虚函数布局引发的问题

    在网上看到一个非常热的帖子,里面是这样的一个问题: 在打印的时候发现pFun的地址和 &(Base::f)的地址竟然不一样太奇怪了?经过一番深入研究,终于把这个问题弄明白了.下面就来一步步进行 ...

  6. Java 添加、替换、删除PDF中的图片

    概述 本文介绍通过java程序向PDF文档添加图片,以及替换和删除PDF中已有的图片.另外,关于图片的操作还可参考设置PDF 图片背景.设置PDF图片水印.读取PDF中的图片.将PDF保存为图片等文章 ...

  7. POJ_3627_贪心

    题目描述: 给你N个数和一个总和,要求求出最少个数的数相加大于等于这个总和. 思路: 很简单的贪心,先排序,从大到小加一次,比较一次,直到符合条件. 我用了优先队列,运行时间好像多了一倍= = #in ...

  8. Codeforces_492_E

    http://codeforces.com/problemset/problem/492/E 题目规定了gcd=1,可以在纸上模拟一下,发现每一个起点,都会经历过n个点,n个点都是不同行不同列.可以把 ...

  9. LeetCode22 生成所有括号对

    本文始发于个人公众号:TechFlow,原创不易,求个关注 链接 Generate Parentheses 难度 Medium 描述 Given n pairs of parentheses, wri ...

  10. ARTS Week 2

    Nov 4,2019 ~ Nov 10,2019 Algorithm 本周主要的算法是如何求两个数的最大公因数.传统的想法便是对这两个数分解质因数,而后找到其公共因数,再相乘,这样就会得到最大公因数了 ...