Sam*_*Sam 3 entity-framework poco repository-pattern service-layer
我正在使用这种Service Layer --> Repository --> Entity Framework (Code-First) w/POCO objects方法,我很难更新实体.
我正在使用AutoMapper将我的域对象映射到我的View模型,这对于获取数据很有用,我怎么不把这些更改带回数据库?
使用纯POCO对象,我会假设没有任何类型的更改跟踪,所以我看到我唯一的选择是自己处理它.您是否确保您的View Models具有与Domain Objects完全相同的属性?如果我只在视图模型上更改一个或两个字段怎么办?域对象上的其余字段是否会被默认值覆盖在数据库中?
话虽如此,最好的方法是什么?
谢谢!
编辑
所以我磕磕绊绊的是这个,让我们举个简单的例子Customer:
1)Controller有一个服务,CustomerService调用服务GetCustmoerByID方法.
2)Service调用CustomerRepository并检索Customer对象.
3)Controller使用AutoMapper映射Customer到ViewModel.
4)Controller将模型交给View.一切都很棒!
现在,在视图中,您对客户进行了一些修改,并将其发回给控制器,以便将更改保留到数据库中.
我想在这一点上对象是分离的.那么模型是否应该具有与Customer对象完全相同的属性?你是否必须为你不想展示的每个项目制作隐藏的字段,以便它们可以坚持下去?
如何处理将对象保存回数据库?如果您的视图/模型仅处理对象上的几个字段会发生什么?
如果您正在使用EF Code First,即:DbContext API,那么您仍然可以使用由上下文类处理的更改跟踪.
在对对象进行更改之后,您所要做的就是调用SaveChanges()上下文并将更改保留在数据库中.
编辑:
由于您使用AutoMapper创建实体的"副本",因此它不再附加到您的上下文.
我想你可以做的是类似于你在ASP.NET MVC(with UpdateModel)中所做的.您可以从上下文中获取原始实体,获取ViewModel(可能包含已更改的属性)并手动更新旧实体(仅修改属性)或使用AutoMapper.然后使用持久化更改context.SaveChanges().
另一种解决方案是将模型实体作为ViewModel的[部分]发送.这样,您就可以将实体附加到容器中,并且更改跟踪仍然有效.
希望这可以帮助 :)
| 归档时间: |
|
| 查看次数: |
3288 次 |
| 最近记录: |