多个实体框架DbContext仍导致并发异常

时间:2015-02-05 04:33:47

标签: c# entity-framework asynchronous

所以,我基本上试图使它能够运行多个任务,每个任务都有自己的DbContext,这样它们就不会导致异常。基本上,就像ASP.NET异步处理程序的工作方式一样。现在我正在做一些事情

// set up the unity container
// WON'T WORK the dbUnitOfWork will used in two tasks.
container.RegisterType<Framework.Data.IDbUnitOfWork, Framework.Data.EntityFramework.DbUnitOfWork>(Core.IoC.Lifetime.PerThread);
container.RegisterFactory<System.Data.Entity.DbContext, ContextFactory>(o => o.Create, Framework.Core.IoC.Lifetime.Transient);



AsyncContext.Run(() => app.Run());
// run the following code fragment with an Async Context from Nito



workers.AddRange(container.resolveAll<IWorker>());
foreach (var worker in workers) {
    tasks.add(worker.WorkAsync());
}
Tasks.WhenAll(tasks);

但是,每当我不断受到这种诅咒时,会发生什么?#34; NotSupportedException&#34;因为在同一个DbContext上启动了第二个操作。我尝试在Unity中使我的DbContext成为PerThread,但这似乎仍然没有效果。我每个线程的方式(至少希望)是

Tasks.Run(() => worker.WorkAsync());

我只希望能够使用自己的DbContext运行一组任务。这样他们就可以异步进行独立的数据库操作。那么我该如何实现这种理想的行为。

1 个答案:

答案 0 :(得分:1)

根据您的评论,我知道问题的原因可能是您定义了PerThread的{​​{1}}生命周期并将其注入以下代码行:

IDbUnitOfWork

因此,您在同一个主线程中注入workers.AddRange(container.resolveAll<IWorker>()); ,这就是您获得相同实例的原因。