欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

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

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)在 windowsmacos 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)针对可测试性进行构建。

3razor pages 可以使基于页面的编码方式更简单高效。

4blazor 允许你在浏览器中使用 c# javascript。 共享全部使用 .net 编写的服务器端和客户端应用逻辑。

5)能够在 windowsmacos linux 上进行开发和运行。

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

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

8)支持使用 grpc 托管远程过程调用 (rpc)

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

10)内置依赖项注入。

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

12)能够托管于以下各项:kestreliishttp.sysnginxapachedocker

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