【问题标题】:Multiple entity framework DbContext still leads to concurrent exception多实体框架 DbContext 依然导致并发异常
【发布时间】:2015-02-05 04:33:46
【问题描述】:

所以,我基本上是在尝试这样做,以便我可以运行多个任务,每个任务都有自己的 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);

但是发生的情况是,每次我因为在同一个 DbContext 上启动第二次操作而不断收到这个被诅咒的“NotSupportedException”。我尝试让我的 DbContext 在 Unity 中成为 PerThread,但这似乎仍然不起作用。我拉每个线程的方式(至少希望如此)是

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

我只想能够运行一组任务,每个任务都有自己的 DbContext。使它们都可以异步地做独立的数据库操作。那么我该如何实现这种期望的行为。

【问题讨论】:

  • 什么是 IWorker,它在 WorkAsync 中的作用是什么?
  • IWorker 有 1 个返回 Task 的方法 WorkAsync。
  • 如何将 IDbUnitOfWork 注入到 IWorker 实现中?如果您只向我们展示代码会更容易
  • 我只是做基于构造函数的依赖注入,构造函数看起来像 WorkerConcrete(IDbUnitOfWork dbUnitOfWork) { this.dbUnitOfWork = dbUnitOfWork; }

标签: c# entity-framework asynchronous


【解决方案1】:

根据您的 cmets,我知道问题的原因可能是您定义了 IDbUnitOfWorkPerThread 生命周期并将其注入以下代码行:

workers.AddRange(container.resolveAll<IWorker>());

所以,你在同一个主线程中注入 IDbUnitOfWork,这就是你得到同一个实例的原因。

【讨论】:

  • 是的,但我该如何解决。 IDK 如何像 ASP.NET 使用的 PerHttpRequest 那样做。
  • 如果您只需要单独的 IDbUnitOfWork 实例,则使用瞬态生命周期,以便每个解析创建一个新实例。此外,您可以运行单独的线程并在每个线程中解析 IDbUnitOfWork(在这种情况下 PerThread 将起作用)。另请注意,运行异步任务并不意味着它在单独的线程中运行,实际上它们在同一线程中运行。
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多