实体框架服务层更新POCO

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映射CustomerViewModel.

4)Controller将模型交给View.一切都很棒!

现在,在视图中,您对客户进行了一些修改,并将其发回给控制器,以便将更改保留到数据库中.

我想在这一点上对象是分离的.那么模型是否应该具有与Customer对象完全相同的属性?你是否必须为你不想展示的每个项目制作隐藏的字段,以便它们可以坚持下去?

如何处理将对象保存回数据库?如果您的视图/模型仅处理对象上的几个字段会发生什么?

Abd*_*men 5

如果您正在使用EF Code First,即:DbContext API,那么您仍然可以使用由上下文类处理的更改跟踪.

在对对象进行更改之后,您所要做的就是调用SaveChanges()上下文并将更改保留在数据库中.

编辑:

由于您使用AutoMapper创建实体的"副本",因此它不再附加到您的上下文.

我想你可以做的是类似于你在ASP.NET MVC(with UpdateModel)中所做的.您可以从上下文中获取原始实体,获取ViewModel(可能包含已更改的属性)并手动更新旧实体(仅修改属性)或使用AutoMapper.然后使用持久化更改context.SaveChanges().

另一种解决方案是将模型实体作为ViewModel的[部分]发送.这样,您就可以将实体附加到容器中,并且更改跟踪仍然有效.

希望这可以帮助 :)