栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

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

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

简述.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){
}

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/908273.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号