使用Unity时Azure Worker角色中的DbContext错误

时间:2012-06-22 04:33:26

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

我有一个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相关错误,例如:

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

是什么给出了?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

在我看来,无所事事。

感谢您的帮助。