.Net Core 程序报错 在上一个操作完成之前,在此上下文上启动了第二个操作

2 篇文章 0 订阅
2 篇文章 0 订阅
在使用单例模式注入数据库上下文时,遇到在异步任务中启动新线程操作数据库导致的错误。问题源于不同线程间的并发操作,由于DbContext不是线程安全的,所以引发了错误。解决办法包括避免在新线程中直接操作数据库,或者为每个操作创建新的DbContext实例。具体做法是通过DbContextOptionsBuilder新建实例进行数据库操作。
摘要由CSDN通过智能技术生成

程序完整报错:

A second operation started on this context before a previous operation completed. This is usually caused by different threads using the same instance of DbContext, however instance members are not guaranteed to be thread safe. This could also be caused by a nested query being evaluated on the client, if this is the case rewrite the query avoiding nested invocations.

中文翻译:

在上一个操作完成之前,在此上下文上启动了第二个操作。这通常是由使用同一DbContext实例的不同线程造成的,但是实例成员不能保证线程安全。这也可能是由于在客户机上计算的嵌套查询造成的,如果是这种情况,请重写查询以避免嵌套调用。

出现这个问题的原因是,我的数据库注入用的是单例模式,然后我在一个异步方法里用Task.Factory.StartNew开启了一个新线程,然后在这个新线程里操作了数据库。之后就发现这个错了。

解决办法:

1、避免在新开启的线程里操作数据库,可以单独封装方法然后通过返回值的方式去做一些处理。

2、重新New一个上下文

var optionsBuilder = new DbContextOptionsBuilder<SqlContext>(); 
optionsBuilder.UseSqlite(Configuration.GetConnectionString("Sqlite"));
using (var context = new SqlContext(optionsBuilder.Options))
{
 //操作数据库的时候用context去保存
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值