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

对于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数据上下文的创建方式,如需转载请自行联系原博主。

时间: 2024-07-31 16:40:44

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

DotNetCore跨平台~EFCore废弃了TransactionScope取而代之的Context.Database.BeginTransaction

TransactionScope是.net平台基于的分布式事务组件,它默认为本地事务,同时当系统有需要时可以自动提升为分布式事务,而对系统的前提是要开启MSDTC服务,必要时需要在数据库服务器与应用服务器之间添加hosts的映射,这些在之前已经写过很多文章了,在这里不再说了. 之前对TransactionScope的一些理解和总结 第二十六回   将不确定变为确定~transactionscope何时提升为分布式事务? 第二十七回   将不确定变为确定~transactionscope何时提升为

DotNetCore跨平台~EFCore连接Mysql的方式

在.net frameworks的ef里连接mysql我们已经测试通过了,而在dotnet core里的efCore上去连接mysql我们需要测试一下,并且在测试过程中出现了一些问题,当然最后也是解决了,下面总结一下,分享给大家! mysql项目的依赖包 数据上下文和连接串 数据仓储 添加模块扩展 业务层注入 业务实现 mysql项目的依赖包 Microsoft.EntityFrameworkCore MySql.Data.EntityFrameworkCore 数据上下文和连接串 对于mysq

DotNetCore跨平台~文章索引~永久更新

本索引目录主要包括仓储大叔对dotnet core架构的研究与知识积累,从2016年开始进行撰写,到今天已经有一年多了,其中有一些小知识,小技巧,小应用,希望给大家在开发时一些启发,也希望dotnet core越来越好,希望2.0正式版快点出来! 我们的框架应该是基于组件化的! 我们的系统应该是基于微服务化的! 我们的部署,应该是基于自动化的! DotNetCore跨平台目录 DotNetCore跨平台~Startup类的介绍(2016-05-31 16:25) Linux~centos上安装.

更快更强更酷——全新跨平台大数据可视化分析平台OurwayBI强势来袭!

2017年10月18日,将是中国企业级大数据可视化应用领域的一个里程碑!中国领先的大数据&商业智能厂商奥威软件潜心研发18个月,采用最新的前后端技术,终于推出了全新的跨平台大数据可视化平台--OurwayBI.新产品将以公司名称直接命名,迈出了奥威软件全新品牌市场战略的第一步!        奥威软件从成立之初,就以普及企业商业智能应用为己任,11年来,不忘初心,砥砺前行,不断打磨产品,让产品变得更快.更强.更酷! 更快.更强.更酷        1          技术更先进:node.js

DotNetCore跨平台~服务总线_事件总线的重新设计

理论闲话 之前在.netFramework平台用的好好的,可升级到.net core平台之后,由于不再需要二进制序列化,导致咱们的事件机制遇到了问题,之前大叔的事件一直是将处理程序序列化后进行存储的,处理存储的参数为事件源,一个事件源可以由多个处理程序订阅,当事件源被发布时,这些被序列化的代码段会被回调执行,这是大叔之前的思路,在RedisBus和MemoryBus里已经得到了实现,读过大叔源代码的同学应该有所了解了. 事件源和处理程序 /// <summary> /// 事件源 /// &l

DotNetCore跨平台~Moq框架实现模拟测试

当我们进行软件开发时,一般会写单元测试,而对于业务情景来说,一般是测试它的业务逻辑准确性,对于你的测试数据是否来自数据库还是文件,是否为真实还是模拟,并不是很关心!我关心的就是我的业务逻辑是否正确! 所以我们的单元测试在调用底层接口时,尤其是数据持久层的接口时,一般可以使用mock的方式,即模拟一个接口,期望的参数和期望的结果就够了,而没有必要真正去连接数据库,事实上,在业务测试里,使用真实的数据库没有什么意义!无非是加大测试的复杂度! 一个不错的mock测试工具 Moq,它在nuget上已经有

VR改变大数据的四种方式

文章讲的是VR改变大数据的四种方式,在这个信息爆炸的时代,数据采集正以惊人的速度发展,但我们不一定了解这些数据.目前,大数据就像是一种肆无忌惮的"野兽"--非常复杂.无结构.传统2D屏幕条形图和饼状图已无法分析大数据,也无法帮助我们有效处理大型数据集.根据Forbes研究显示,我们的眼睛每秒仅能处理传统计算机屏幕中100字节的信息,所以我们需要新技术来解决大数据带来的多重挑战,幸运的是,虚拟现实可能正好可以帮助我们解决这些挑战. ▲图片来源于:东方网 自20世纪90年代以来,虚拟现实(

转 cocos2d-x 3.0 常用对象的创建方式

cocos2d-x 3.0 中所有对象几乎都可以用create函数来创建,其他的创建方式也是有create函数衍生. 下面来介绍下create函数创建一般对象的方法,省得开发中经常忘记啥的. 1.精灵Sprite的4种创建方式 (1)根据图片资源路径来创建 ? 1 2 3 4 //根据图片路径来创建 auto sprite1 = Sprite::create(filepath); //根据图片路径来创建,并设置要显示的图片大小 auto sprite2 = Sprite::create(file

浅谈JavaScript对象的创建方式_javascript技巧

通过Object构造函数或对象字面量创建对象时,使用同一个接口创建很多对象时,会产生大量的重复代码.为了简化,引入了工厂模式. 工厂模式 function createPerson(name, age, job) { var obj = new Object(); obj.name = name; obj.age = age; obj.job = job; obj.sayHello(){ alert(this.name); }; return obj; } var p1 = createPers