0

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

4

1 回答 1

0

我倾向于将我的项目安排如下;

1)表示层:

Contains my Views and ViewModels

2)业务层:

Contains my business logic

3)数据层:

Contains my models

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

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

Using DBContext As Entities = ConnectToDatabase()

    Dim clsApprovalTypes As New Repositories.clsApprovalTypesRepository(DBContext)

    dbResults = clsApprovalTypes.GetRecords()

End Using

Return dbResults

在这里,我只是将上下文传递到存储库中,一旦返回数据,“结束使用”将处理我的上下文。

为了使用在我的 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

于 2013-05-24T23:36:18.590 回答