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. pymysql连接提示format: a number is required, not str

    最近想随手写一个简单的员工管理系统,第一次使用python连接数据库,在这个过程中就遇到了一些问题,遂记录 遇到问题习惯性百度一下,很多教程都不适合新手,有些还不知道是不是瞎写的,所以我觉得有必要自己 ...

  2. 物流跟踪API-快递单推送

    上一篇文章我们讲解了订阅服务功能.我们已经完成了如何把物流订单订阅到快递鸟,快递鸟也能接收到我们的订单信息,接下来就需要快递鸟实时的将最新的物流轨迹推送到我们服务器,我们既然要接收快递鸟的信息,就需要 ...

  3. 《 Java 编程思想》CH05 初始化与清理

    < Java 编程思想>CH05 初始化与清理 用构造器确保初始化 在 Java 中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.Java 会保证初始化的进行.构造器采用与类相 ...

  4. [pathlib]内置pathlib库的常用属性和方法

    pathlib中的Path类可以创建path路径对象, 属于比os.path更高抽象级别的对象. 官网 from pathlib import Path path = Path(__file__) p ...

  5. codeforces 1025B Weakened Common Divisor(质因数分解)

    题意: 给你n对数,求一个数,可以让他整除每一对数的其中一个 思路: 枚举第一对数的质因数,然后暴力 代码: #include<iostream> #include<cstdio&g ...

  6. 题解 NOI2004【郁闷的出纳员】

    \[ Preface \] 之前用 treap 打,交了四遍才过. 自学了 fhq treap 后,才意识到是一道 fhq treap 板子题,直接码上,一遍就过. 本题解提供的是 fhq treap ...

  7. 动手学习pytorch——(1)线性回归

    最近参加了伯禹教育的动手学习深度学习项目,现在对第一章(线性回归)部分进行一个总结. 这里从线性回归模型之从零开始的实现和使用pytorch的简洁两个部分进行总结. 损失函数,选取平方函数来评估误差, ...

  8. python学习(7)关于列表操作相关命令以及浅复制深复制

    在python中,[]表示的是列表.列表有各种操作命令. 1.append()方法,添加一个元素到列表尾部. 注意append()方法与extend()方法有区别:list.append(object ...

  9. 从linux命令行分享文件:bashupload.com和transfer.sh

    背景 传输文件是一个常见的需求,简单的做法是通过即时通讯工具,邮件,网盘完成. 但当分享或接收的一端为远程服务器,只有命令行可以操作时,一个能支持在命令行完成分享和下载的工具,就会省下不少麻烦. 下面 ...

  10. qt creator源码全方面分析(2-10)

    目录 Creating Plugins Creating Plugins Qt Creator的核心是一个插件加载程序,加载并运行一组插件,实际上是这些插件提供了您从Qt Creator IDE中了解 ...