我有一个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相关错误,例如:
“不允许新事务,因为会话中还有其他线程运行。”
是什么给出了?
答案 0 :(得分:0)
您正在谈论PerResolveLifetimeManager
,但您在代码中使用PerThreadLifetimeManager
(据说无论如何都是错误的)。那可能是你问题的原因吗?
答案 1 :(得分:0)
好吧,我重构了解决方案来做更明确的Resolve调用而不是.ctor注入然后毕竟我意识到主要问题是在迭代包含它的IQueryable时尝试更新对象。
在我看来,无所事事。
感谢您的帮助。