我的问题是如何在使用EF6,Prism Unity,MVVM,WPF和本地数据库的桌面应用程序中处理UnitOfWork。我想在每次创建视图时创建和处理UnitOfWork(包括其DbContext)。
当用户选择菜单项时,SubMenuViewModel会激活所选视图。例如,如果我选择AdrTypeView,则SubMenuViewModel执行此操作:
using (CallingCreateUoWASync())
{
RegionManager.RegisterViewWithRegion(RegionNames.MainRegionLeft, typeof(AdrTypeView));
}
Prism的RegisterViewWithRegion方法都创建并激活视图。我正在从SubMenuViewModel异步创建EntityUnitOfWork,以便在加载视图时可以创建DbContext。
private async Task CreateUoWASync()
{
await Task.Run(() =>
{
EntityUnitOfWork MyUnitOfWork = new EntityUnitOfWork();
});
}
在显示AdrTypeView之后,如果我从SubMenuViewModel中选择另一个视图,AdrTypeView将从该区域消失,由于AdrTypeViewModel实现了IRegionMemberLifetime,并且KeepAlive设置为false,因此为该区域中的新视图腾出空间。
问题是MyUnitOfWork的实例仍然存在,它引用了AdrType存储库。
编辑:我认为我的问题的答案更多地涉及如何从EntityUnitOfWork的单例实例更改为为每个视图创建EntityUnitOfWork的新实例。
我从moduleinit类中删除了EntityUnitOfWork的容器注册,即
Container.RegisterType<EntityUnitOfWork, EntityUnitOfWork("EntityUnitOfWork");
所以我没有为EntityUnitOfWork做任何容器注册。在我更改和处理视图之后,EntityUnitOfWork的单例实例仍然存在。当我这样做时,我可以看到旧的值:
EntityUnitOfWork _unitOfWork = ServiceLocator.Current.GetInstance<EntityUnitOfWork>();
那么如何使用Container.RegisterType或Container.RegisterInstance处理EntityUnitOfWork?我可能更喜欢以编程方式处理实例。谢谢。
答案 0 :(得分:1)
使用using
时会隐式调用dispose方法。
// Context gets disposed when leaving the using block
using (var uow = CallingCreateUoWASync())
{
// do something with uow
uow.Add(...);
uow.SaveChanges();
}
如果您不使用using
,则必须明确调用.Dispose()
方法。