控制台程序中实现一个连接一个DBContext实例

news/2023/9/22 17:39:17

最近在控制台程序中使用EFCore,并使用了依赖注入的方式注册调用,但测试时发现不同客户端连接对应了同一个DBContext,导致并发出现问题。踩得坑记录一下。

在ASP.NET Core应用程序中使用EF Core的基本模式通常包括将自定义DbContext类型注册到依赖项注入系统中,然后通过控制器中的构造函数参数获取该类型的实例。这意味着将为每个请求创建一个新的DbContext实例。

public void ConfigureServices(IServiceCollection services)
{
 services.AddDbContext<MCContext >(
     options => options.UseSqlServer(connectionString));
 }




public class TiketsController : ControllerBase
{
    private readonly MCContext _context;

    public TiketsController (MCContext context)
    {
        _context = context;
    }
 }

但是 AddDbContext方法对应的服务生命周期是 Scoped,这样在控制台程序中使用会有一个问题,如果控制台提供一个服务,客户端不同的连接对应的都是一个Context,这样存在并发的问题,如果有个语句出错了,后面操作都将报错。

有AddSingleton、AddScoped、AddTransient 三种方式注册服务,对应的生命周期如下:

  1、Transient:每次从容器 (IServiceProvider)中获取的时候都是一个新的实例

  2、Singleton:每次从同根容器中(同根 IServiceProvider)获取的时候都是同一个实例

  3、Scoped:每次从同一个容器中获取的实例是相同的、

所以在控制台中要用AddTransient的方法注册DbContext:

var Services = new ServiceCollection().AddTransient<DbContext>((c) =>
     {
         var optionsBuilder = new DbContextOptionsBuilder<DbContext>();
         optionsBuilder.UseMySql(connStr, ServerVersion.AutoDetect(connStr))
         .LogTo(Console.WriteLine, LogLevel.Information)
         .EnableSensitiveDataLogging()
         .EnableDetailedErrors();
         //如果有其他依赖的话,可以通过provider.GetService<XX>()来获取
         return new DbContext(optionsBuilder.Options);
     }).BuildServiceProvider();

如果用AddSingleton方法写法:

 var Services = new ServiceCollection().AddSingleton<Func<DbContext>>(() =>
    {
        var optionsBuilder = new DbContextOptionsBuilder<DbContext>();
        optionsBuilder.UseMySql(connStr, ServerVersion.AutoDetect(connStr))
        .LogTo(Console.WriteLine, LogLevel.Information)
        .EnableSensitiveDataLogging()
        .EnableDetailedErrors();
        //如果有其他依赖的话,可以通过provider.GetService<XX>()来获取
        return new DbContext(optionsBuilder.Options);
    }).BuildServiceProvider();

参考:

解析 .Net Core 注入——注册服务 | 服务 (lmlphp.com)

(14条消息) EF Core之DBContext生命周期_2Ker的博客-CSDN博客_adddbcontext 生命周期

在ASP.Net Core中每个请求一次创建EF Core上下文 | (1r1g.com)


http://www.inspinia.net/a/14222.html

相关文章

uniapp学习笔记 真机运行遇到的问题

真机运行遇到的问题 使用uni.choseimage这个api只能打开相册打不开相机 环境:打包成wgt后导入到安卓中进行内嵌 具体问题:在HBuilderX基底中自己作为一个app打包运行没问题,既可以打开相机也可以打开相册,但是作为一个插件的形式导入到安卓android studio项目后只能打开相册不…

107.(前端)分类管理增加值实现——使用elementui中的动态编辑标签发送请求

1.概述 本节要实现的功能就是&#xff0c;当我们点击动态编辑标签时&#xff0c;丢失焦点或者回车时&#xff0c;发送请求。 2.流程 handleInputConfirm()中&#xff0c;验证form输入框中是否存在值&#xff0c;若存在添加数据到val&#xff0c;若不存在&#xff0c;就制空va…

故障分析 | MySQL 节点宕机分析一例

作者&#xff1a;周启超 爱可生北分团队 DBA&#xff0c;主要负责项目前期建设及后期疑难问题支持。做事认真&#xff0c;对事负责。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 之前遇…

c++的STL+string

目录 STL 什么是STL&#xff1f; STL有哪些版本&#xff1f; string string的使用&#xff1a; string st1 st2 "北山口镇"​编辑 string st3 "巩义市" string st4(10, *) cout << st1 << endl string st6(st2); string st7 st2; …

学习笔记-Linux 安全

Linux 安全 免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关. 漏洞利用 OS-Exploits LOL Living Off The Land 相关文章 busybox docker 受限环境下回传文件命令行上线小技巧 相关资源 GTFOBinshttps://github.com…

基于Session实现短信登录

目录 一、基于Session实现登录 1.1 业务流程图​编辑 二、发送短信验证码 2.1 发送短信请求方式及参数说明 2.2 业务层代码模拟发送短信 三、登录功能 3.1 短信验证的请求方式及路径 3.2 业务层代码实现用户登录 3.3 拦截器——登录验证功能 三、隐藏用户敏感信息 …

【面试题】面试小技巧:如果有人问你 xxx 技术是什么?

我正在参加「掘金启航计划」 背景 在前几天&#xff0c;有一个朋友突然问了我一个问题&#xff0c;说如果有人问你“React 是什么&#xff1f;你怎么回答。 ”&#xff0c;我当时脱口而出“React 是一个网页 UI 框架一个&#xff0c;它的特点声明式、组件化、组件化、一次学习…

【ESP32 DEVKIT_V1】北醒TF系列雷达在ESP32 DEVKIT_V1开发板上的运用

目录前言一、硬件准备二、硬件接线说明串口接线示意图&#xff1a;I2C接先示意图三、软件搭建及测试1、使用Arduino IDE编译教程2、使用vsCodeArduino教程2.1 在vsCode上使用Arduino的环境搭建2.2 配置烧录和测试3、使用vsCodePlatformIO编译教程四、源代码串口版本源代码&…

3D three.js(1)怎么写一个3D旋转的正方体

效果如图所示&#xff1a; 本篇暂未用到three.js&#xff0c;但是能学到一些基础的3D知识&#xff01; 先记住xyz轴的展示和画法&#xff1a; rotate:左手法则___ 伸出左手&#xff0c;大拇指指向正轴方向&#xff0c;四个手指的指向即是旋转正向&#xff0c;但务必记住是左手…

python再学习之列表、元组、字典

python再学习之列表、元组、字典一、列表二、元组三、字典一、列表 和C语言中的数组差不多是一个东西。列表中的每一个元素都会有一个索引与之对应&#xff0c;第一个元素索引是0&#xff0c;第二个元素索引是1&#xff0c;以此类推。   想要访问列表中的数据则可以通过索引来…

Apisix自定义日志模块

Apisix是有个日志输出模块的&#xff0c;官方文档在此&#xff1a;https://apisix.apache.org/zh/docs/apisix/2.15/plugins/file-logger/ 但是它最大的问题在于&#xff0c;日志格式僵化&#xff0c;只能是json&#xff0c;不能是字符串&#xff0c;而且不支持传参&#xff0c…

PaddleBox:百度基于GPU的超大规模离散DNN模型训练解决方案

作者 | 焦学武、李淼 导读 本文介绍百度基于GPU的超大规模离散DNN训练框架PaddleBox。PaddleBox 打造了业界首个层次化GPU稀疏参数服务器&#xff0c;结合高效的流水线调度架构&#xff0c;以及多机多卡的分布式架构&#xff0c;支持单机10TB级/多机数十TB模型训练&#xff0c;…

MySQL是怎么保证数据不丢失的

一.什么是两阶段提交 1.SQL语句&#xff08;update user set name‘李四’ where id3&#xff09;的执行流程是怎样的呢&#xff1f; 1.执行器先找引擎取 ID3这一行。ID 是主键&#xff0c;引擎直接用树搜索找到这一行。 2.如果 ID3 这一行所在的数据页本来就在内存中&#x…

2022 需求工程综合论述题【太原理工大学】

需求工程考题的最后一个模块 —— 综合论述题&#xff0c;只出一道题&#xff0c;30分&#xff0c;马上要考试了&#xff0c;临时抱佛脚其实还是非常管用的 hhh&#xff0c;简答、选择、填空及材料分析题前面博客已更&#xff0c;重点把下面这两个题看明白&#xff0c;仅供参考…

Vue2 带纵向合并的原生表格实现切割侧栏分页

文章目录前言一、目标效果二、失败方案三、正确方案四、解决正确方案中的一个Bug总结前言 前端表格分页. 带纵向合并的表格, 到达固定行数强制分页, 截断本页纵向合并, 在下页展示该纵向列的剩余部分, 代码多为前端数据处理, 所以仅提供思路. 这并不难, 你可以直接看第三节. 一…

【三维目标检测】PointRCNN(一)

PointRCNN是用于点云三维目标检测模型算法&#xff0c;发表在CVPR2019《PointRCNN: 3D Object Proposal Generation and Detection From Point Cloud》。论文网址为https://arxiv.org/abs/1812.04244。PointRCNN核心思想在于使用点云前景点生成候选框&#xff0c;充分利用了目标…

汇编语言初识

文章目录汇编语言初始缺点优点应用场景汇编语言语言语法介绍labeloperationcomment汇编指令操作对象汇编指令编码格式汇编语言初始 汇编语言是一种低级的语言,这个语言更加接近硬件&#xff0c;可以绕开编译器的优化 缺点 难移植&#xff1a;我们为x86写的汇编语言无法使用在…

CSDN 编程竞赛·第八期总结

CSDN 编程竞赛第八期总结1.代写匿名信2.小艺改编字符串3.开学趣闻之美食诱惑4.争抢糖豆CSDN 编程竞赛第八期为笔者参加的第三次 CSDN 编程竞赛&#xff0c;本来报名了第七期的&#xff0c;因为时间和二十大撞了&#xff0c;就错过了&#xff0c;第八期成绩似乎不错&#xff0c;…

C++学习笔记

《黑马程序员》学习记录 一、C 基础编程 1、初识 注释&#xff1a;单行注释&#xff0c;多行注释变量常量&#xff1a; define 宏常量&#xff1a;#define A 10const 修饰的变量&#xff1a;const int A 10; 关键字标识符命名规则&#xff1a; 不能是关键字只能由字母、数字…

Simulink建模:位运算

本文研究Simulink中常用的按位运算的建模方法。 文章目录1 引入2 位运算模块2.1 移位模块2.1 按位逻辑运算3 位运算的应用3.1DBC矩阵解析3.2 bool信号打包4 总结1 引入 在计算机的基础课中&#xff0c;学过把一个十进制数转换成二进制数。例如&#xff0c;十进制的63转换为二进…