C# Automapper和一个对象集合,引用父对象

C# Automapper和一个对象集合,引用父对象,c#,automapper-3,C#,Automapper 3,如果我用一个(虚构的)例子来解释这一点,可能是最简单的 我有一个包含Order对象的nHibernate模型。此Order对象包含OrderItem nHibernate对象的集合 我有一个Order ViewModel,其中包含OrderItemDto的集合(实际上只是POCO) 在我的UI中,我显示一个order对象和OrderItems列表,它们在列表中是可编辑的。模型绑定负责将OrderViewModel和OrderItemDto填充到集合中 这是我的模型 namespace nHibe

如果我用一个(虚构的)例子来解释这一点,可能是最简单的

我有一个包含Order对象的nHibernate模型。此Order对象包含OrderItem nHibernate对象的集合

我有一个Order ViewModel,其中包含OrderItemDto的集合(实际上只是POCO)

在我的UI中,我显示一个order对象和OrderItems列表,它们在列表中是可编辑的。模型绑定负责将OrderViewModel和OrderItemDto填充到集合中

这是我的模型

namespace nHibernateModel
{
    public class Order
    {
        private readonly IList<OrderItem> _OrderItems; 

        public int Id { get; set; } 


        public Order()
        {
            _OrderItems = new List<OrderItem>();
        }

        public  IList<OrderItem> OrderItems
        {
            /* Setter does not exist to satisfy CA2227*/
            get
            {
                return _OrderItems;
            }
        }


        public void AddOrderItem(OrderItem orderItem)
        {
            //Set bi-directional relationships
            if (_OrderItems.Contains(orderItem))
                return;

            orderItem.Order = this;
           _OrderItems.Add(orderItem);

        }
    }

    public class OrderItem
    {

        private readonly Order _Order;
        public int Id { get; set; }

        public Order Order
        {
            get { return _Order; }

            set { value.OrderItems.Add(this); }
        }

    }

}
名称空间nHibernateModel
{
公共阶级秩序
{
私有只读IList_OrderItems;
公共int Id{get;set;}
公共秩序()
{
_OrderItems=新列表();
}
公共IList订单项
{
/*Setter不存在以满足CA2227的要求*/
得到
{
返回订单项;
}
}
公共无效AddOrderItem(OrderItem OrderItem)
{
//设置双向关系
if(_OrderItems.Contains(orderItem))
返回;
orderItem.Order=this;
_添加(orderItem);
}
}
公共类OrderItem
{
私人只读订单_订单;
公共int Id{get;set;}
治安
{
获取{return\u Order;}
设置{value.OrderItems.Add(this);}
}
}
}
这是我的视图模型/dto

namespace ViewModels
{
    public class OrderViewModel
    {
        public OrderViewModel()
        {
            OrderItemDtos = new List<OrderItemDto>() ;
        }

        public IList<OrderItemDto> OrderItemDtos;
        public int Id { get; set; }
    }

    public class OrderItemDto
    {

        public int Id { get; set; }
    }
}
名称空间视图模型
{
公共类OrderViewModel
{
public OrderViewModel()
{
OrderItemDtos=新列表();
}
公共IList OrderItemDtos;
公共int Id{get;set;}
}
公共类OrderItemDto
{
公共int Id{get;set;}
}
}
我的问题是如何将OrderItemDto的集合映射到附加到订单的OrderItem对象集合。我想要控制orderItem对象的生命周期。也就是说,如果OrderItemDto有一个Id,我想从存储库中获取orderItem。如果它不存在,我想创建一个新的,并将其order属性设置为父订单

以下是我认为需要的伪代码:

public class OrderModelToDtoMap
{
    public OrderModelToDtoMap()
    {
        Mapper.CreateMap<OrderItemDto, OrderItem>();
        Mapper.CreateMap<OrderViewModel, Order>()
            .ForMember(dest => dest.OrderItems,
                opt => opt.ResolveUsing(OrderItemDtosToOrderItemResolver)(src => src.OrderItemDtos));
    }


    private class OrderItemDtosToOrderItemResolver : IValueResolver
    {
        protected override ResolveCore(IList<OrderItemDto> source, Order order)
        {
            foreach (OrderItemDto orderItemDto in source)
            {
                OrderItem orderItem;
                if (orderItemDto.Id == null)
                {
                    orderItem = new OrderItem();
                    orderItem.Order = order;
                }
                else
                {
                    OrderItemRepository.Get(orderItemDto.Id);
                }

                /* Map other properties */
            }
        }
    }
公共类OrderModelTodMap
{
public OrderModelToDtoMap()
{
CreateMap();
Mapper.CreateMap()
.FormMember(dest=>dest.OrderItems,
opt=>opt.resolvesusing(OrderItemDtosToOrderItemResolver)(src=>src.OrderItemDtos));
}
私有类OrderItemDtoOrderItemResolver:IValueResolver
{
受保护的覆盖ResolveCore(IList源,订单)
{
foreach(源中的OrderItemDto OrderItemDto)
{
订单项目订单项目;
if(orderItemDto.Id==null)
{
orderItem=新的orderItem();
orderItem.Order=订单;
}
其他的
{
获取(orderimentdto.Id);
}
/*映射其他属性*/
}
}
}
但显然,这不起作用,因为IValueResolver不是这样工作的

这有点类似,但不允许我将OrderItems从存储库中取出(如果它们已经存在)

谢谢, dave

我刚刚发布了可能与此相关的信息。