处置UnitOfWork

时间:2016-01-20 19:27:01

标签: wpf entity-framework mvvm prism dbcontext

我的问题是如何在使用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?我可能更喜欢以编程方式处理实例。谢谢。

1 个答案:

答案 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()方法。