Ошибки DbContext в рабочей роли Azure при использовании Unity

У меня есть рабочая роль 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) { }
}

Я бы подумал, что это довольно прямолинейно.

Теперь я хотел бы настроить DbContext для кода в Unity таким образом, чтобы каждый раз при разрешении UnitOfWork создавался новый DbContext, и все впоследствии разрешенные репозитории также получали его.

Я думаю, что PerResolveLifetimeManager справится с задачей:

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

Но это не так. Я получаю все эти странные ошибки, связанные с SQL, например:

«Новая транзакция не разрешена, поскольку в сеансе выполняются другие потоки».

Что дает?


person Sanin    schedule 22.06.2012    source источник
comment
Не могли бы вы опубликовать пример того, как вы вызываете репозиторий из рабочей роли?   -  person Sandrino Di Mattia    schedule 22.06.2012
comment
Примечание. UnitOfWork внедряется в объект ICommand, который отправляется WorkerRole. Внутри экземпляров ICommand это выглядит так: UnitOfWork.LoginRepository.DoSomething(); Единица Работы.Совершение();   -  person Sanin    schedule 22.06.2012


Ответы (2)


Вы говорите о PerResolveLifetimeManager, но вы используете PerThreadLifetimeManager (который в любом случае считается глючным) в своем коде. Может ли это быть причиной ваших проблем?

person Sebastian Weber    schedule 22.06.2012

Хорошо, я реорганизовал решение, чтобы делать гораздо более явные вызовы Resolve вместо внедрения .ctor, а затем, после всего этого, я понял, что основная проблема связана с попыткой обновить объект во время итерации по IQueryable, который его содержит.

Мне кажется, много шума из ничего.

Спасибо за помощь.

person Sanin    schedule 22.06.2012
comment
Хорошо, у меня были надежды, когда я увидел заголовок этого вопроса ... но затем вы ответили этим ответом, который мне не помогает. Я разместил свой вопрос stackoverflow.com/questions/17532233/ - person Thiago Silva; 08.07.2013