我知道标题听起来像是很多现有文章的重复,但是我已经阅读了很多文章,而我的处境却大不相同。如果有任何使用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/