DotNetCore跨平台~EFCore数据上下文的创建方式

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介:

对于DotNetCore来说,把大部分组件者放在DI容器里,在startup中进行注入,在类的构造方法中进行使用,如果某些情况下,无法使用这种DI的方式,也可以自己控制数据上下文的生产过程,下面说一下。

一 标准注入+构造方法使用

数据上下文的定义,带参数的构造方法,注意他和使用什么类型的数据库没有关系,只是单纯的上下文

   public partial class ErpContext : DbContext, IERPContext
    {
        public ErpContext(DbContextOptions dbContextOptions) : base(dbContextOptions)
        { }
   }

startup类中去注入指定的数据源和数据库连接串,注意在这里就有了数据库类型(如sqlserver,mysql,sqllite)和数据连接串

            services.AddDbContextPool<ErpContext>(
                options => options.UseMySql("Server=123.56.31.133;DataBase=erp;UID=front;Password=PlP2017_#Test;charset=utf8;port=3306;SslMode=None"));

而对于使用者来说,就是某个控制器上,也是通过构造方法的DI来实现的,事实上dotnetcore把ioc&di这些模式都集成了

 public ValuesController(ErpContext context)
 {
            this.context = context;
 }

二 不使用注入,直接建立数据上下文,手动建立DbContextOptions对象

这种类似于传统的方法,数据上下文对象里固定连接串,即某个上下文只属于某个数据库!

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseMySql("Server=123.56.31.133;DataBase=erp;UID=front;Password=PlP2017_#Test;charset=utf8;port=3306;SslMode=None");
            base.OnConfiguring(optionsBuilder);
        }

三 还有一种就是,即使用注入,也使用自动构造的方式来建立数据上下文

事实上就是在初始化上下文时,把optionsBuilder做为参数传进来,这个比较灵活

 public class ERPRepository<T> : EFRepository<T> where T : class
    {
         public ERPRepository() : base(new ErpContext(
            new DbContextOptionsBuilder().UseMySql("Server=123.56.31.133;DataBase=erp;UID=front;Password=PlP2017_#Test;charset=utf8;port=3306;SslMode=None").Options))
        { }
    }

以上几种方式就是我们使用数据上下文时的方法,还有一点要说话的,当使用了Pomelo.EntityFrameworkCore.MySql这个包包之后,请观察一下代码的性能,主要表现在linq的一对多查询上,代码如下:

       //一对多,效率很低
            var linq2 = from data1 in crm_customers.GetModel()
                        join data2 in crm_customertag.GetModel()
                        on data1.Id equals data2.CustomerId into list
                        select new
                        {
                            name = data1.AccountantName,
                            orders = list,
                        };

            var result2 = linq2.Take(10).ToList();

感谢各位的阅读!

我们下次将对一些性能存在问题的代码进行改善!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:DotNetCore跨平台~EFCore数据上下文的创建方式,如需转载请自行联系原博主。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
Go
【平台开发】基于 config、gencode_* 生成服务端ORM框架代码
【平台开发】基于 config、gencode_* 生成服务端ORM框架代码
27 1
|
7月前
|
XML JavaScript 前端开发
SAP UI5 本地开发如何实现 XML 和 JavaScript 代码的自动完成和嵌入式 API 文档自动显示试读版
SAP UI5 本地开发如何实现 XML 和 JavaScript 代码的自动完成和嵌入式 API 文档自动显示试读版
66 0
|
XML 自然语言处理 JavaScript
SAP UI5 本地开发如何实现 XML 和 JavaScript 代码的自动完成和嵌入式 API 文档自动显示
SAP UI5 本地开发如何实现 XML 和 JavaScript 代码的自动完成和嵌入式 API 文档自动显示
|
数据库连接 数据库 C++
entity framework core在独立类库下执行迁移操作
entity framework core在独立类库下执行迁移操作
83 0
|
编解码 分布式计算 Java
基于 netty 封装的超简单通俗易用 服务端客户端交互框架 《net-framework》原理,源码和使用说明,开箱即用,只需要开发业务逻辑,完全自定义无限扩充 [结尾附github源码]
基于 netty 封装的超简单通俗易用 服务端客户端交互框架 《net-framework》原理,源码和使用说明,开箱即用,只需要开发业务逻辑,完全自定义无限扩充 [结尾附github源码]
基于 netty 封装的超简单通俗易用 服务端客户端交互框架 《net-framework》原理,源码和使用说明,开箱即用,只需要开发业务逻辑,完全自定义无限扩充 [结尾附github源码]
|
存储 前端开发 JavaScript
Go 语言 Web 开发很简单:使用模板将视图与逻辑分离
我们的 Web 服务器由两部分构成: 为在用户浏览器中运行的 HTML 和 JavaScript 前端代码提供服务; 接受 Web socket 连接以允许客户端进行通信。
Go 语言 Web 开发很简单:使用模板将视图与逻辑分离
|
数据库 容器
.NET Core2.1下采用EFCore比较原生IOC、AspectCore、AutoFac之间的性能
一、前言  ASP.NET Core本身已经集成了一个轻量级的IOC容器,开发者只需要定义好接口后,在Startup.cs的ConfigureServices方法里使用对应生命周期的绑定方法即可,常见方法如下 services.
2689 0
|
Android开发 计算机视觉
基于QProbe创建基本Android图像处理框架
先来看一个GIF   这个GIF中有以下几个值得注意的地方 这个界面是基本的主要界面所应该在的地方。其右下角有一个“+”号,点击后,打开图像采集界面 在这个界面最上面的地方,显示的是当前图像处理的状态。
1120 0