【发布时间】:2016-09-07 07:13:53
【问题描述】:
我在使用 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 的生命周期。
【问题讨论】:
-
不确定它是否适合您的场景,但您是否尝试过
ReceiveAsync()和 awaitdb.SaveChanges()?
标签: .net akka akka.net actor-model