【发布时间】:2014-12-18 16:18:28
【问题描述】:
我知道标题听起来像是很多现有帖子的副本,但我已经阅读了很多帖子,而我的情况实际上完全不同。如果任何有 Entity Framework 经验的人可以就以下场景的最佳架构提供一些建议,我将不胜感激。
我有一个具有 3 层布局、数据访问层、业务逻辑层和 UI 表示层的 wpf 应用程序。 UI 使用 MVVM。 DAL 使用实体框架。 UI 和数据访问层各有自己的模型,即 UIModel 和 DataModel。
当前设计在整个应用程序中为实体框架使用全局 DbContext。对于简单的更新操作,从数据库中检索实体作为 DataModel,转换为 GUIModel,连接到 ViewModel 和 View 以进行更新,然后转换回 DataModel 以在数据库中更新。这就是问题所在:当从转换中创建新的 DataModel 时,它不再与检索到的原始实体相关,并且 Entity Framework 无法执行更新,因为它现在有两个相同主键的重复模型附加到同一个 DbContext .
我做了一些研究,发现了几种可能的方法来解决这个问题。一种是跨所有层使用单个模型实体,而不是将 GUIModel 和 DataModel 分开,并将全局 DbContext 分解为工作单元。这似乎是一个很常见的设计,但我对这种做法的担忧是 GUIModel 和 DataModel 的合并违反了职责分离,并且使用工作单元需要 Business Layer 来控制 DbContext 的生命周期,这也模糊了两者之间的界限BLL 和 DAL。
第二种选择是为每个带有using 块的数据库查询使用本地 DbContext。这似乎是最节省内存的。但是这样做会使延迟加载变得不可能,并且在每个查询中急切加载所有导航属性可能会影响性能。此外,短暂的 DbContexts 需要完全在断开连接的图中工作,这在更改跟踪方面变得相当复杂。
第三种可能性是缓存所有原始数据模型并在更新后更新这些实体。
我是 Entity Framework 的新手,我相信应该还有其他方法来解决这个问题。如果有人能就解决此问题的最佳方法提供一些见解,我将不胜感激。
【问题讨论】:
标签: asp.net wpf entity-framework mvvm n-tier-architecture