控制台程序中实现一个连接一个DBContext实例
admin
2024-01-18 19:51:50
0

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

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

public void ConfigureServices(IServiceCollection services)
{services.AddDbContext(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((c) =>{var optionsBuilder = new DbContextOptionsBuilder();optionsBuilder.UseMySql(connStr, ServerVersion.AutoDetect(connStr)).LogTo(Console.WriteLine, LogLevel.Information).EnableSensitiveDataLogging().EnableDetailedErrors();//如果有其他依赖的话,可以通过provider.GetService()来获取return new DbContext(optionsBuilder.Options);}).BuildServiceProvider();

如果用AddSingleton方法写法:

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

参考:

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

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

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

相关内容

热门资讯

ios系统备份数据到安卓系统,... 你有没有想过,把iPhone上的宝贝数据搬到安卓手机上呢?这可不是什么难事,今天就来给你详细说说,怎...
安卓系统架构有哪些组成,深入解... 你有没有想过,那个陪伴你每天刷手机、玩游戏、办公的安卓系统,它到底是怎么运作的呢?今天,就让我带你一...
安卓系统能改成windows系... 你有没有想过,你的安卓手机或者平板,竟然可以摇身一变,变成一个Windows系统的电脑?是的,你没有...
安卓系统怎样关闭微信 手机里的微信是不是有时候让你觉得信息太多,想要清静一下?别急,今天就来教你怎么在安卓系统上轻松关闭微...
苹果系统监管严吗安卓,系统生态... 说到手机操作系统,你有没有想过,为什么苹果系统和安卓系统在监管上给人的感觉大不相同呢?今天,我们就来...
安卓系统怎么强制安装,安卓系统... 你是不是也遇到了这样的烦恼:手机里有些应用就是死活不肯安装?别急,今天就来教你怎么在安卓系统上强制安...
安卓系统关闭锁屏时间,轻松实现... 你有没有发现,手机里的安卓系统有时候真的让人又爱又恨呢?它那么强大,功能又多,但有时候又让人头疼不已...
安卓系统最开始的机子,开启智能... 你有没有想过,手机的世界是怎么一步步从那个小小的安卓系统开始的呢?想象那些最早的安卓机子,它们可是开...
怎么看安卓9.0系统,体验全新... 亲爱的读者们,你是否也像我一样,对安卓9.0系统充满了好奇和期待?随着科技的飞速发展,操作系统也在不...
安卓系统小额扣款在哪看 你有没有遇到过这种情况:手机里突然少了点零花钱,却不知道是哪个APP偷偷扣了款?别急,今天就来教你怎...
安卓8系统兼容面具吗 你有没有想过,你的安卓8系统手机能不能装上那些酷炫的面具应用呢?这可是个让人心头一紧的问题,毕竟谁不...
安卓手机系统升级流程,从准备到... 你有没有发现,你的安卓手机最近总是时不时地提醒你系统要升级啦?是不是有点小激动,又有点小紧张呢?别急...
51虚拟机安卓系统,功能解析与... 你有没有想过,在手机上也能体验到电脑的强大功能呢?没错,这就是51虚拟机安卓系统的魅力所在!今天,就...
王者安卓苹果互通系统,安卓苹果... 哇,你知道吗?最近在游戏界可是掀起了一股热潮,那就是《王者荣耀》的安卓和苹果互通系统!是不是听起来就...
黑苹果单系统安卓,黑苹果单系统... 亲爱的读者们,你是否曾梦想过拥有一台既能运行Windows系统,又能畅玩安卓应用的电脑呢?今天,就让...
安卓系统怎么开启隐藏键,安卓系... 你有没有发现安卓手机里藏着一些小秘密呢?比如那些隐藏的键,它们就像手机里的宝藏,等着你去发现和开启。...
华为安卓系统开机页面,科技美学... 亲爱的读者,你是否曾好奇过,当你按下华为手机的开机键,那独特的安卓系统开机页面背后隐藏着怎样的故事?...
安卓系统手机号标记,一键识别号... 你有没有发现,现在用安卓系统手机的人越来越多了呢?手机号标记这个功能,简直就是咱们日常生活中的小帮手...
鸿蒙5.0系统和安卓区别,系统... 你知道吗?最近手机圈子里可是炸开了锅,因为华为的新操作系统鸿蒙5.0系统终于发布了!这可是个大新闻,...
安装安卓系统套件的软件,软件应... 你有没有想过,给你的手机换换口味?是的,就是那种从iOS跳到安卓的感觉,是不是听起来就有点小刺激呢?...