asp.net - 具有三层架构的 Entity Framework ,跨域的不同实体

标签 asp.net wpf entity-framework mvvm n-tier-architecture

我知道标题听起来像是很多现有文章的重复,但是我已经阅读了很多文章,而我的处境却大不相同。如果有任何使用Entity Framework的经验的人可以针对以下情况提供有关最佳架构的一些建议,我将不胜感激。

我有一个带有3层布局,数据访问层,业务逻辑层和UI表示层的wpf应用程序。 UI使用MVVM。 DAL使用 Entity Framework 。 UI和数据访问层各自具有自己的模型UIModel和DataModel。

当前设计在整个应用程序中为 Entity Framework 使用全局DbContext。对于简单的更新操作,从数据库中检索实体作为DataModel,将其转换为GUIModel,连接到ViewModel和View以进行更新,然后转换回DataModel以在数据库中进行更新。这就是问题所在:从转换中创建新的DataModel时,它不再与检索到的原始实体相关,并且Entity Framework无法执行更新,因为现在它具有两个重复的模型,它们具有相同的主键附加到相同的DbContext 。

我做了一些研究,发现了解决此问题的几种可能方法。一种是在所有层上使用单个模型实体,而不是将GUIModel和DataModel分开,然后将全局DbContext分解为工作单元。这似乎是一个非常普通的设计,但是我对这种方法的担心是GUIModel和DataModel的合并违反了职责分离,并且使用业务单元所需的业务层来控制DbContext的生存期,这也模糊了两者之间的界限。 BLL和DAL。

第二种选择是对每个带有using块的数据库查询使用本地DbContext。这似乎是最有效的内存。但是以这种方式进行操作使得不可能进行延迟加载,并且急于在每个查询中加载所有导航属性可能会影响性能。同样,短暂的DbContext需要完全在断开连接的图中工作,这在更改跟踪方面变得相当复杂。

第三种可能性是缓存所有原始DataModel,并在更新后在这些实体上进行更新。

我是Entity Framework的新手,我敢肯定也应该有其他方法来解决此问题。如果有人能提供最佳方法的见解,我将不胜感激。

最佳答案

更好的方法是,当您要在存储库中进行更新调用时,首先要通过主键获取实体,因为您现在处于dbContext中,具有要更新的所需实体,然后分配更新的字段并更新Context。

这是代码:

public void UpdateEntity(Entity updatedEntity)
    {
        using (var db = new DBEntities())
        {
            var entity = db.Entities.Find(updatedEntity.Id);
            if (entity!= null)
            {
                entity.Name = updatedEntity.Name;
                entity.Description = updatedEntity.Description;
                entity.LastModifiedBy = updatedEntity.LastModifiedBy;
                entity.Value = updatedEntity.Value;
                entity.LastModifiedOn = DateTime.Now;
                db.SaveChanges();
            }
        }
     }

关于asp.net - 具有三层架构的 Entity Framework ,跨域的不同实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27551109/

相关文章:

c# - 如何在C#中生成RTF文档服务器端

c# - 为什么注册模块会禁用重写?

.net - 用于 asp.net 的 System.Windows.Media.Imaging

entity-framework - ef core 2.0scaffold-dbcontext自定义命名空间

sql-server - 将 Guid 主键和聚集索引迁移到 INT (Azure SQL)

c# - 使用 C# 代码运行 "Update-Database"Power Shell 命令时出现问题

c# - Telerik RadListBox 不想拖动

c# - 内联 Eval if 语句返回常量

c# - 马哈普斯地铁 : Show non-modal auto-closing message dialog at the bottom of the window

c# - WPF INotifyPropertyChanged 是如何工作的?