Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC映射层访问服务层_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# 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

我设计了我的应用程序(带有EF6的ASP.NET MVC),因此有一个映射层负责保存从实体到视图模型的来回映射。它由控制器使用,因此通常的编辑操作基本上如下所示

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数据映射到实体(映射层)、更新更改(服务)

我错过什么了吗