2012-08-05 52 views
1

我目前正在使用MVVM Light作为MVVM框架,实体框架作为ORM和MS同步框架作为同步手段的WPF MVVM应用程序本地Sql Compact DB与在线SQL数据库。该应用程序的范围也相当复杂,因为它旨在管理资产,计算在整个生命周期内使用该资产时的损耗。幸运的是,我对所有这些技术都陌生,所以无知是幸福:)我找到了很多有关创建工作单元模式和存储库模式的教程和信息。但是,我正在使用新读的DbContext,我已经阅读过这两种模式。生成ADO.Net DbContext到视图模型的最佳方法

我目前的问题涉及在实体框架中使用新的DbContext。我在VS中使用了DbContext Generator模板,所以我有一个MyDbModelContainer。我直接从我的视图模型中使用了这个,这为每个虚拟机创建了一个Context,我敢肯定这是一个坏主意。这里是我的父/子类型数据输入场景的构造函数,我在这里构造容器,并且他们使用MVVM Light将选定项传递给子虚拟机。

Private FatigueDbContext As FatigueModelContainer 

Public Sub New() 

    If IsInDesignMode = False Then 

     FatigueDbContext = New FatigueModelContainer 

     FatigueDbContext.CtMaterials.Load() 
     CtMaterialsCollection = FatigueDbContext.CtMaterials.Local 

     FatigueDbContext.CtManufactures.Load() 
     CtManufactures = FatigueDbContext.CtManufactures.Local 

    End If 

End Sub 

我想保持上下文打开我的视图模型的寿命,这样我可以使用MyDbModelContainer.MyTable.Local进行绑定。所以,虽然这是工作,我应该如何正确处理这个?

我的直觉是我需要以某种方式将自动生成的MyDbModelContainer包装到一些基本上只包含我需要在该视图模型中使用的表和函数的类中。

我不使用视图模型定位,而是另一种视图模型来管理我的看法,计上心来,从Rachel's blog,我喜欢这个概念。但是,这意味着我要先创建所有View-Models,并预先初始化任何视图模型依赖项。我只有一个窗口,只是在它们留在内存中的视图模型之间切换,而当切换到新的视图模型时,我没有办法关闭我的DbContext。

这里是壳牌视图模型

Public Class ShellViewModel 
Inherits ViewModelBase 

#Region "Fields" 

Private _changePageCommand As ICommand 
Private _currentPageViewModel As IPageViewModel 
Private _pageViewModels As List(Of IPageViewModel) 

#End Region 

Public Sub New() 
    Dim DialogService As New ModalDialogService 

    ' Add available pages 
    PageViewModels.Add(New ImportJobDataViewModel(DialogService)) 
    PageViewModels.Add(New TestViewModel()) 
    PageViewModels.Add(New ReverseBendUtilityViewModel(DialogService)) 

    ' Set starting page 
    CurrentPageViewModel = PageViewModels(0) 
End Sub 

#Region "Properties/Commands" 

Public ReadOnly Property ChangePageCommand() As ICommand 
    Get 
     If _changePageCommand Is Nothing Then 

      _changePageCommand = New RelayCommand(Of IPageViewModel)(Sub(param) ChangeViewModel(param)) 

     End If 
     Return _changePageCommand 
    End Get 
End Property 

Private Function IsViewPageModel(viewPageModel As IPageViewModel) As Boolean 
    If TypeOf (viewPageModel) Is IPageViewModel Then 
     Return True 
    Else 
     Return False 
    End If 
End Function 

Public ReadOnly Property PageViewModels() As List(Of IPageViewModel) 
    Get 
     If _pageViewModels Is Nothing Then 
      _pageViewModels = New List(Of IPageViewModel)() 
     End If 
     Return _pageViewModels 
    End Get 
End Property 

Public Property CurrentPageViewModel() As IPageViewModel 
    Get 
     Return _currentPageViewModel 
    End Get 
    Set(value As IPageViewModel) 
     If _currentPageViewModel IsNot value Then 
      _currentPageViewModel = value 
      RaisePropertyChanged(Function() CurrentPageViewModel) 
     End If 
    End Set 
End Property 

#End Region 

#Region "Methods" 

Private Sub ChangeViewModel(viewModel As IPageViewModel) 
    If Not PageViewModels.Contains(viewModel) Then 
     PageViewModels.Add(viewModel) 
    End If 

    CurrentPageViewModel = PageViewModels.FirstOrDefault(Function(vm) vm Is viewModel) 
End Sub 

#End Region 

End Class 

因此,代码以总括起来......我应该从自动生成FatigueModelContainer一边创造了一些单独的类,会是什么阶级的样子比如说,它会只是一个班级,还是根据业务运营的不同分类?例如添加,更新和删除制作的类,添加,更新和删除材质的类等。我应该在哪里插入虚拟机?推测在壳牌视图模型?

+0

我通常在'IPageViewModel'上为任何初始化逻辑提供一个通用的'SetActive()'方法,并且每当CurrentPageViewModel发生变化时调用'CurrentPageViewModel.SetActive()' – Rachel 2012-10-31 13:33:47

回答

0

你可以在没有真正触及你的数据库上下文的情况下解决这个问题。这个想法是,即使虚拟机停留在内存中,您只需要在虚拟机视图处于活动状态时初始化模型实例。

Caliburn.Micro: Screens and Conductors中有一个很好的方法可以解决这个问题,但它并不特定于mvvm框架。

在最基本的情况下,正如Rachel在上面的评论中提到的,您将IPageViewModel扩展为包含处理VM的激活和去激活逻辑的函数:激活VM时激活逻辑,去激活逻辑为当VM被停用时调用。

的实际调用激活/停用将在容器中进行的IPageViewModels,例如:

Public Property CurrentPageViewModel() As IPageViewModel 
    Get 
     Return _currentPageViewModel 
    End Get 
    Set(value As IPageViewModel) 
     If _currentPageViewModel Is value Then 
      Return 
     End If 

     If _currentPageViewModel IsNot Nothing Then 
      _currentPageViewModel.Deactivate() 
     End If 

     _currentPageViewModel = value 

     If value IsNot Nothing Then 
      value.Activate() 
     End If  

     RaisePropertyChanged(Function() CurrentPageViewModel) 
    End Set 
End Property 

这样,你可以关闭数据库连接/拆卸的DbContext当一个页面被关闭和开启当页面被激活时。

+0

我实际上结束了一点混合应用程序,我现在使用一个ViewModelLocator作为我的主导航以及一个框架。但我仍然在使用DataTemplates来处理应用程序的其他领域......我喜欢上述建议,并可能最终在未来实现它。 – GetFuzzy 2012-12-22 07:21:35