C# MVC映射层访问服务层
我设计了我的应用程序(带有EF6的ASP.NET MVC),因此有一个映射层负责保存从实体到视图模型的来回映射。它由控制器使用,因此通常的编辑操作基本上如下所示C# MVC映射层访问服务层,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我设计了我的应用程序(带有EF6的ASP.NET MVC),因此有一个映射层负责保存从实体到视图模型的来回映射。它由控制器使用,因此通常的编辑操作基本上如下所示 var entity = DataService.Get(viewModel.Id); entity = Mapper.MapToEntity(viewModel, entity); DataService.Update(entity); 基本MapToEntity实现使用AutoMapper映射对象的基本属性 Update()在EF
var entity = DataService.Get(viewModel.Id);
entity = Mapper.MapToEntity(viewModel, entity);
DataService.Update(entity);
基本MapToEntity实现使用AutoMapper映射对象的基本属性
Update()在EF6中作为一个函数实现,该函数将实体标记为已修改,并调用基础上下文SaveChanges()
但是,对于更复杂的映射,如具有相关实体的实体(例如订单),Mapper类执行更多操作。例如,使用ViewModel相关对象数据更新相关实体对象(OrderDetails),将父Id(OrderId)分配给新的子对象,最后是有问题的问题:删除子对象
现在,我的专业映射程序有一个对相关实体的服务对象的引用,该实体有一个MarkEntityToDelete函数,调用该函数只是为了在底层数据库集中标记要删除的实体
foreach (var orderDetail in viewModel.OrderDetails.Where(d => d.Id != 0 || d.Delete == false))
{
var orderDetailToUpdate = orderDetail.Id == 0 ? new OrderDetail() : _orderDataService.GetOrderDetail(orderDetail.Id);
if (orderDetail.Delete)
{
_orderDataService.MarkLineaAsDeleted(orderDetailToUpdate);
}
else
{
Mapper.Map(orderDetail, orderDetailToUpdate);
if (orderDetail.Id != 0) continue;
orderDetailToUpdate.MantenimientoId = order.Id;
order.OrderDetails.Add(orderDetailToUpdate);
}
}
这是一个依赖关系,因为实现使用EF6,事务边界在服务内部,所以映射程序不能直接删除对象,只需将其标记为删除即可
foreach (var orderDetail in viewModel.OrderDetails.Where(d => d.Id != 0 || d.Delete == false))
{
var orderDetailToUpdate = orderDetail.Id == 0 ? new OrderDetail() : _orderDataService.GetOrderDetail(orderDetail.Id);
if (orderDetail.Delete)
{
_orderDataService.MarkLineaAsDeleted(orderDetailToUpdate);
}
else
{
Mapper.Map(orderDetail, orderDetailToUpdate);
if (orderDetail.Id != 0) continue;
orderDetailToUpdate.MantenimientoId = order.Id;
order.OrderDetails.Add(orderDetailToUpdate);
}
}
虽然这个解决方案在实践中效果很好,但我并不特别喜欢它。我不认为Mapper对象应该以这种方式依赖于服务对象,只是为了标记要删除的子对象。
我尝试使用以下代码:
entity.EntregasCuenta.Remove(entity.EntregasCuenta.Single(e => e.Id == entregaCuenta.Id));
但是它给出了一个外键检查错误,这是预期的,因为我没有删除相关实体,而是删除关系
所以我的问题是,地图绘制者应该如何处理这种情况?从ViewModel到实体的映射应该由映射层完成,但更新相关实体应该由服务完成。最后,控制器的职责应该只是按顺序调用三个操作,即检索实体(服务)、将viewmodel数据映射到实体(映射层)、更新更改(服务)
我错过什么了吗