在厚WPF客户端中管理DbContext Lifetime

时间:2013-05-24 22:30:06

标签: wpf entity-framework design-patterns mvvm sql-server-ce

我知道这个问题已经被提出并进行了很多讨论(例如HereHere以及此Article)。尽管如此,我仍然对此感到困惑。我知道DbContext s不应该在应用程序生命周期内存活,我知道它们应该按照Form(窗口)或每个Presenter使用。问题是我没有表格或演示者。我有一个包含许多视图模型的Form(Window),其中一些在应用程序的持续时间内存在,几乎所有的视图模型都依赖于DbContext(LOB应用程序,WPF,MVVM,Sql Server CE) 。
我的解决方案是将DbContext隐藏在工厂后面,该工厂注入所有需要访问DbContext的视图模型,并且这些视图模型在加载相应视图时创建/处置DbContext /卸载。 我想知道这个解决方案是否存在任何问题,或者是否有更好的解决方案可以提供建议?

1 个答案:

答案 0 :(得分:0)

我倾向于按照以下方式展示我的项目;

1)表示层:

Contains my Views and ViewModels

2)业务层:

Contains my business logic

3)数据层:

Contains my models

我的Presentation层调用业务层来填充我希望在ViewModel / View中使用的数据的本地副本(在ViewModel中保存)。

这是通过Using语句实现的,例如;

Using DBContext As Entities = ConnectToDatabase()

    Dim clsApprovalTypes As New Repositories.clsApprovalTypesRepository(DBContext)

    dbResults = clsApprovalTypes.GetRecords()

End Using

Return dbResults

这里我只是将Context传递给Repository,一旦返回数据,“End Using”将处理我的上下文。

要使用我的ViewModel / View中所做的更改来更新上下文,我使用AddEdit例程,该例程接受记录,并根据需要使用与上述类似的方法更新/添加到上下文,例如;

Using DBContext As CriticalPathEntities = ConnectToDatabase()

        Dim clsApprovalTypes As New Repositories.clsApprovalTypesRepository(DBContext)

        clsApprovalTypes.AddEditRecord(ApprovalTypeToSave)

        Try

            clsApprovalTypes.SaveData()

        Catch ex As Exception

            Return ex

        End Try

End Using

我的AddEdit例程就像;

SavedRecord = New ApprovalType                'Store the Saved Record for use later

Dim query = From c In DBContext.ApprovalTypes
                    Where c.ApprovalType_ID = RecordToSave.ApprovalType_ID
                    Select c

If query.Count > 0 Then

    SavedRecord = query.FirstOrDefault

End If

'
' Use Reflection here to copy all matching Properties between the Source Entity
' and the Entity to be Saved...
'
SavedRecord = Classes.clsHelpers.CopyProperties(RecordToSave, SavedRecord)

If query.Count = 0 Then

    Try

        DBContext.ApprovalTypes.Add(SavedRecord)

    Catch ex As EntityException

        Return ex

    End Try

End If

我在这里写了一些关于其中的一些内容;

https://stackoverflow.com/a/15014599/1305169