我试图了解如何在将db上下文注入到类中时处理使用实体框架的并行异步任务。
我有一个显示多个总计的仪表板,我尝试做的是运行并行返回这些总计的方法。目前我有一些看起来像这样的代码:
Task.WaitAll
当我运行该代码时,我从sentence = "ASK NOT WHAT YOUR COUNTRY CAN DO FOR YOU ASK WHAT YOU CAN DO FOR
YOUR COUNTRY"
s = sentence.split()
positions = [s.index(x)+1 for x in s]
my_list = ['ASK', 'NOT', 'WHAT', 'YOUR', 'COUNTRY', 'CAN', 'DO', 'FOR',
'YOU', 'ASK', 'WHAT', 'YOU', 'CAN', 'DO', 'FOR', 'YOUR', 'COUNTRY']
unique = []
[unique.append(item) for item in my_list if item not in unique]
print("The sentence",sentence,"contains the words",unique)
print("It can be recreated from the positions of the words in this
list",s,"using the sequence",positions)
行收到此错误:
InvalidOperationException:未关闭连接。该 连接的当前状态正在连接。
在some reading之后我意识到Entity Framework is not thread safe,所以,我猜测造成异常的原因是我的每项任务都在运行,所有这些都是使用相同的上下文实例并导致EF引发异常?
因此,解决方案似乎是为每个任务创建一个新的上下文实例,但是我使用依赖注入,所以默认情况下我的上下文实例的范围是服务器请求的生命周期(我认为)
那么,上述理解是否正确,如果是这样,是为每个任务获取新上下文而不是重用现有任务的解决方案?我该怎么做?
答案 0 :(得分:3)
我添加了一个工厂类来创建我的上下文的新实例:
public class KpiContextFactory: IKpiContextFactory
{
private string _connection = @"Server=.\SQL2008EXP;Database=kpiDb;Trusted_Connection=True;";
public KpiContext GetNewContext()
{
var optionsBuilder = new DbContextOptionsBuilder<KpiContext>();
optionsBuilder.UseSqlServer(_connection);
return new KpiContext(optionsBuilder.Options);
}
}
现在我只是注入该工厂而不是上下文本身,然后调用_kpiContextFactory.GetNewContext().[method]
而不是_context.[method]
。这似乎工作正常。