Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework MVVM+;实体框架架构混乱_Entity Framework_Mvvm_Unit Of Work_Objectcontext - Fatal编程技术网

Entity framework MVVM+;实体框架架构混乱

Entity framework MVVM+;实体框架架构混乱,entity-framework,mvvm,unit-of-work,objectcontext,Entity Framework,Mvvm,Unit Of Work,Objectcontext,我正在WPF应用程序中使用带EF的Prism框架 视图模型: 保留服务引用(通过unity容器传递) 服务: 正在为“高级”操作提供数据 保留对存储库的引用,它为数据库提供基本的CRUD操作(每个存储库一个表) 存储库: 存储库中的每个方法都使用“使用”模式,在这里我使用的是短期对象上下文 这就是我陷入困境的地方:在处理对象上下文之后,我无法再使用映射属性。我的数据库模型很复杂(有许多相关的表),检索数据时有许多.Include()调用会使代码变脏 在阅读了几个线程之后,我发现“工作

我正在WPF应用程序中使用带EF的Prism框架

视图模型:

  • 保留服务引用(通过unity容器传递)
服务:

  • 正在为“高级”操作提供数据
  • 保留对存储库的引用,它为数据库提供基本的CRUD操作(每个存储库一个表)
存储库:

  • 存储库中的每个方法都使用“使用”模式,在这里我使用的是短期对象上下文
这就是我陷入困境的地方:在处理对象上下文之后,我无法再使用映射属性。我的数据库模型很复杂(有许多相关的表),检索数据时有许多.Include()调用会使代码变脏

在阅读了几个线程之后,我发现“工作单元”模式可能正是我所需要的

我的问题来了:

谁保存工作单元的引用(以及上下文)? 如果我选择按视图上下文的方法,viewModel应该有上下文引用。
那么,我如何将工作单元注入到我的服务中呢?或者我应该在ViewModel中创建新的服务实例并在构造函数参数中传递上下文吗?

我们在项目中使用了类似的体系结构:

  • 每个ViewModel都有自己的服务对象,该对象被注入到构造函数中(至少是与视图直接对应的顶级对象。一些分层ViewModel可能会重用其父级的服务,但让我们在这里保持简单)

  • 默认情况下,每个服务操作都会创建一个新的上下文,但是

  • 服务具有可以调用的BeginContext和EndContext方法 通过ViewModels在多个操作中保持上下文打开


这对我们来说非常有效。大多数情况下,我们在打开视图时调用BeginContext,在关闭视图时调用EndContext。

最后,我用以下方法解决这个问题:打开视图时,ViewModel创建UnitOfWork对象,该对象由上下文和多个服务组成。同一工作单元中的服务注入了相同的上下文。关闭视图时,将处理工作单元。这个主题中的项目也很鼓舞人心。谢谢你,丹尼尔。