前言

公司之前使用Ado.net和Dapper进行数据访问层的操作, 进行读写分离也比较简单, 只要使用对应的数据库连接字符串即可. 而最近要迁移到新系统中,新系统使用.net core和EF Core进行数据访问. 所以趁着国庆假期拿出一两天时间研究了一下如何EF Core进行读写分离.

思路

根据园子里的Jeffcky大神的博客, 参考

最简单的思路就是使用手动切换EF Core上下文的连接, 即context.Database.GetDbConnection().ConnectionString = "xxx", 但必须要先创建上下文, 再关闭之前的连接, 才能进行切换

上面的两种方式都是从切换数据库连接入手,但是频繁的切换数据库连接势必会对性能造成影响. 我认为最理想的方式是要避免数据库连接的切换, 且能够适应多DbContext的情况, 在创建上下文实例时,就指定好是访问主库还是从库, 而不是在后期再进行数据库切换. 因此, 在上下文实例化时,就传入相应的数据库连接字符串, 这样一来DbContext的创建就需要交由我们自己来进行, 就不是由DI容器进行创建了. 同时仓储应该区分为只读和可读可写两种,以防止其他人对从库进行写操作.

实现

IReadOnlyRepository接口是只读仓储接口,提供查询相关方法,IRepository接口是可读可写仓储接口,提供增删查改等方法, 接口的实现就那些东西这里就省略了.

RepositoryFactory提供仓储对象的实例化

IDbProvider 接口, 根据上下文类型和配置文件中的数据库连接字符串名称创建IUnitOfWork, 在DI中的生命周期是Scoped,在销毁的同时会销毁数据库上下文对象, 下面是它的实现, 为了提高性能使用了Expression来代替反射.

总结

本文给出的解决方案适用于系统中存在多个不同的上下文,能够适应复杂的业务场景.但对已有代码的侵入性比较大,不知道有没有更好的方案,欢迎一起探讨.

原文链接:https://www.cnblogs.com/KiraYoshikage/p/11628781.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

EF Core 实现读写分离的最佳方案相关推荐

  1. EntityFramework Core进行读写分离最佳实践方式,了解一下(二)?

    写过上一篇关于EF Core中读写分离最佳实践方式后,虽然在一定程度上改善了问题,但是在评论中有的指出更换到从数据库. 那么接下来要进行插入此时又要切换到主数据库,同时有的指出是否可以进行底层无感知操 ...

  2. EntityFramework Core进行读写分离最佳实践方式,了解一下?

    本来打算写ASP.NET Core MVC基础系列内容,博客评论有园友提出讲讲读写分离,这个问题提的好. 大多数情况下,对于园友在评论中提出的问题,如果是值得深究或者大多数同行比较关注的问题我都会私下 ...

  3. mysql主从授权_MySQL主从复制(10)读写分离授权多种方案

    一.生产场景mysql主从复制读写分离授权方案及实战 当配置和好MySQL主从复制以后,所有对数据库内容的更新就必须在主服务器上进行. 那么,为什么所有的更新都要在主服务器上进行呢?这是因为数据复制是 ...

  4. ef mysql 读写分离_基于 EntityFramework 的数据库主从读写分离服务插件

    基于 EntityFramework 的数据库主从读写分离服务插件 1. 版本信息和源码 1.1版本信息 v1.01 beta(2015-04-07),基于 EF 6.1 开发,支持 EF 6.1 之 ...

  5. sql server几种读写分离方案的比较

    原文:sql server几种读写分离方案的比较 在生产环境中我们经常会遇到这种情况: 前端的oltp业务很繁忙,但是需要对这些运营数据进行olap,为了不影响前端正常业务,所以需要将数据库进行读写分 ...

  6. 【架构设计】读写分离、动静分离

    文章目录 读写分离 为什么要读写分离? 如何实现读写分离? 为什么一个主库多个从库? 是否有缺点? 如何解决延迟问题? 具体如何实现? 实现 读写分离与cqrs的区别 动静分离 什么是动静分离 使用n ...

  7. CentoOS7.9搭建mysql5.7分布式集群+主从复制+读写分离知识整理

    一.集群介绍 MySQL的高可用架构无论是社区还是官方,一直在技术上进行探索,这么多年提出了多种解决方案,比如MMM, MHA, NDB Cluster, Galera Cluster, InnoDB ...

  8. 解决数据库读写分离(转)

    如何配置mysql数据库的主从? 单机配置mysql主从:http://my.oschina.net/god/blog/496 常见的解决数据库读写分离有两种方案 1.应用层 http://neore ...

  9. .net core发布 正在发现数据上下文_使用EF Core实现数据库读写分离

    以下文章来源于朝夕Net社区 ,作者Eleven 朝夕Net社区 朝气.丰富.活跃的.Net社区,朝夕教育携百万粉丝共同打造!有技术,有感悟,有新闻,有照片,有故事,还有梦想! [精选转载]| 作者/ ...

最新文章

  1. 认识python(了解)
  2. QuickLook搭配Everthing提高工作效率
  3. java8 LocalDate 日期比较大小
  4. 1.15 Java访问控制修饰符(public、 private、protected 和 friendly)
  5. 使用安全Cookies-笔记
  6. linux浏览器不能播放音频文件夹,在html中插入音频文件在浏览器中播放音频文件的兼容性问题...
  7. Android入门(二) | 项目目录及主要文件作用分析
  8. html模态窗口调试,在模态窗口中显示HTML标记
  9. Spring中bean属性注入方式总结:构造方法、setter注入、p命令空间注入、SpEL注入、集合注入
  10. 积分与坐标变换(极坐标)
  11. Android studio打包遇到的问题总结
  12. 泛型列表(List)的搜索和排序
  13. for的循环在php那边使用,for循环如何在php怎么中使用
  14. 用Java语言编写ajax设计模式_《松本行弘的程序世界》读书笔记(上)——面向对象、程序块、设计模式、ajax...
  15. 关于vivo手机调试安装“解析程序包时出现问题”的解决方案
  16. 苹果开发:开发证书都显示“此证书的签发者无效”的解决方法
  17. 输入两个正整数num1、num2,计算并输出它们的和、差、积、整数商和余数
  18. 共享充电宝的优点有哪些
  19. tomcat报错 Unable to process Jar entry
  20. 浅谈数字媒体艺术中的技术应用-1-技术概述

热门文章

  1. 诈骗者如何伪造电子邮件地址,以及如何分辨
  2. 《图解 HTTP》读书笔记(未完待续)
  3. 关于Unity中的本地存储
  4. 在P2P市场中代替“看不见的手”的算法在哪里
  5. PHP 在作为中间件时print无返回值问题
  6. Object-C中的字符串对象1-不可变字符串
  7. fusioncharts同一页面显示2个仪表盘,且以java字符串作为xml数据
  8. jquery实现多行滚动效果
  9. 在Eigrp做不等值路由的负载均衡
  10. Unix操作系统***追踪反击战