【问题标题】:DbContext Errors in Azure Worker Role when using Unity使用 Unity 时 Azure 辅助角色中的 DbContext 错误
【发布时间】:2012-06-22 04:33:26
【问题描述】:

我有一个 Azure 工作者角色,它的 UnitOfWork 类看起来像这样:

public class UnitOfWork : IUnitOfWork
{
    public MyData Db { get; private set; }

    public ILoginRepository LoginRepository { get; private set; }
    public ISubscriptionRepository SubscriptionRepository { get; private set; }

    public UnitOfWork(MyData db,
        ILoginRepository loginRepository,
        ISubscriptionRepository subscriptionRepository)
    {
    }
}

存储库也接受对 DbContext 的引用:

public class LoginRepository : Repository<Login>, ILoginRepository
{
    public LoginRepository(MyData db) : base(db) { }
}

我认为这很简单。

现在,我想在 Unity 中配置我的代码优先 DbContext,以便每次解析 UnitOfWork 时都会创建一个新的 DbContext,所有随后解析的存储库也可以获取它。

我认为 PerResolveLifetimeManager 可以解决问题:

container.RegisterType<IUnitOfWork, UnitOfWork>();
container.RegisterType<MyData, MyData>(new PerResolveLifetimeManager());

但事实并非如此。我得到了所有这些奇怪的 SQL 相关错误,例如:

“不允许新事务,因为会话中还有其他线程在运行。”

什么给了?

【问题讨论】:

  • 您能否发布一个示例,说明您如何从工作角色调用存储库?
  • 注意:UnitOfWork 被注入到由 WorkerRole 分派的 ICommand 对象中。在 ICommand 实例中,它看起来像这样: UnitOfWork.LoginRepository.DoSomething(); UnitOfWork.Commit();

标签: entity-framework-4 azure ef-code-first unity-container azure-worker-roles


【解决方案1】:

您在谈论PerResolveLifetimeManager,但您在代码中使用PerThreadLifetimeManager(据说无论如何都是错误的)。这可能是您的问题的原因吗?

【讨论】:

    【解决方案2】:

    好的,我重构了解决方案以执行更明确的 Resolve 调用而不是 .ctor 注入,然后我意识到主要问题是在迭代包含它的 IQueryable 时尝试更新对象。

    在我看来,无所事事。

    感谢您的帮助。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2016-04-04
    相关资源
    最近更新 更多