我在使用 AKKA.NET 接收函数中的 SaveChangesAsync 保存对数据库的更改时遇到问题。有人可以解释发生了什么吗?
更多细节:我有这个接收块:
Receive<UpdateUnitVM>((msg) => {
using (var scope = AutofacDependencyContainer.Current.CreateTenantScope(new TenantId(msg.UnitConfiguration.TenantId)))
{
var db = scope.GetService<ApplicationDbContext>();
...work on some objects inside the db context
//now save and continue with next actor using PipeTo
var continueFlags = TaskContinuationOptions.AttachedToParent & TaskContinuationOptions.ExecuteSynchronously;
db.SaveChangesAsync().ContinueWith(myint => new UnitConditionRuleGuard.UnitChanged(msg.UnitConfiguration.GetTenantUnitPair()), continueFlags).PipeTo(unitConditionRuleGuard);
}
});
如果我将代码更改为像这样使用 SaveChanges 它可以工作:
Receive<UpdateUnitVM>((msg) => {
using (var scope = AutofacDependencyContainer.Current.CreateTenantScope(new TenantId(msg.UnitConfiguration.TenantId)))
{
var db = scope.GetService<ApplicationDbContext>();
...work on some objects inside the db context
//now save (blocking) and continue with next actor sequentially
db.SaveChanges();
unitConditionRuleGuard.Tell(new UnitConditionRuleGuard.UnitChanged(msg.UnitConfiguration.GetTenantUnitPair()));
}
});
请注意 using-block 创建了一个新的 Autofac 依赖注入容器范围,因此在 using 块退出后,db-object 被释放。我有一种感觉,这就是问题所在。但是,我不确定该怎么做以及如何适当地延长 dbcontext-object 的生命周期。