简述.Net Framework和.Net Core使用EntityFramework中DBContext多线程所引发问题的解决方案

以下描述,仅代表个人看法,如果有不同看法欢迎讨论

在开发过程中EF是一个使用率较高ORM框架,但是对于刚接触的人来说需要知道的一点就是EF中的数据上下文(DBContext)是非线程安全的。
非线程安全的意思是:当有并发情况时(多个线程操作同一个DBContext),此对象会引发异常
如此说来就会产生一个问题需要我们思考:如何管理DBContext实例?
就问题所引发的异常来看,只需将DBContext实例按照线程划分,即每个线程只使用一个DBContext实例,就能解决线程安全问题

1.在.Net Framework中,可以使用CallContext对象来管理线程中的DBContext,一个线程存一个DBContext对象,直接上菜

private static DbContext GetDbContext()
{
DbContext _context = CallContext.GetData(“dbContext”) as DbContext;
if (_context == null)
{
_context = new MyDbContext();
CallContext.SetData(“dbContext”, _context);
}
return _context;
}

如果想要重新获取DBContext对象,可以 CallContext.SetData(“dbContext”, null);

这种获取DBContext对象的方式,可以满足在同一个请求中使用多线程检索数据内容

2.在.Net Core中没有直接提供CallContext对象,但是好像也有人构造了,需要的可以去搜搜。这里提供的方法并不是线程内唯一,是框架提供的DBContext注入方法,默认一个请求内唯一

services.AddDbContext(option =>
{
option.UseSqlServer(connectionString);
});

使用上述方法在一次请求中如果使用多线程请求DBContext,有可能引发线程安全异常,如果需要在一个请求管道中使用多线程,那么还是建议在Repository层使用如下方法安全些

using(DbContext context=new DbContext){
}

以上方法只是个人开发中的一些方案总结,仅供参考,欢迎讨论!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值