自动映射映射问题:从DTO到ViewModel的展平工作 - 相反不起作用

时间:2011-06-15 17:32:12

标签: asp.net-mvc automapper

我的DTO(为演示目的而简化):

项目(DTO映射到我的ViewModel):

public class Item {
    public Item() { }
    public virtual Guid ID { get; set; }
    public virtual ItemType ItemType { get; set; }
    public virtual string Title { get; set; }
}

ItemType(由我的Item类引用):

public class ItemType {
    public ItemType() { }
    public virtual Guid ID { get; set; }
    public virtual IList<Item> Items { get; set; }
    public virtual string Name { get; set; }
}

我的ViewModel(用于编辑我的Item类数据):

public class ItemEditViewModel {
    public ItemEditViewModel () { }
    public Guid ID { get; set; }
    public Guid ItemTypeID { get; set; }
    public string Title { get; set; }
    public SelectList ItemTypes { get; set; }
    public IEnumerable<ItemType> ItemTypeEntities { get; set; }

    public BuildItemTypesSelectList(Guid? itemTypeID)
    {
        ItemTypes = new SelectList(ItemTypeEntities, "ID", "Name", itemTypeID);
    }
}

我的AutoMapper映射代码:

Mapper.CreateMap<Item, ItemEditViewModel>()
    .ForMember(dest => dest.ItemTypes, opt => opt.Ignore());
Mapper.CreateMap<ItemEditViewModel, Item>();

控制器代码(再次,为演示而简化):

public ActionResult Create()
{
    var itemVM = new ItemEditViewModel();
    // Populates the ItemTypeEntities and ItemTypes properties in the ViewModel:
    PopulateEditViewModelWithItemTypes(itemVM, null);
    return View(itemVM);
}

[HttpPost]
public ActionResult Create(ItemEditViewModel itemVM)
{
    if (ModelState.IsValid) {
        Item newItem = new Item();
        AutoMapper.Mapper.Map(itemVM, newItem);
        newItem.ID = Guid.NewGuid();
        ...
        // Validation and saving code here...
        ...
        return RedirectToAction("Index");
    }

    PopulateEditViewModelWithItemTypes(itemVM, null);
    return View(itemVM);
}

现在,发生了什么:

在我的HttpPost Create操作结果中,在我的控制器中,我使用Automapper将ItemEditViewModel映射到我的Item DTO类,在SelectList中选择的ItemType ID值不绑定到Item.ItemType.ID属性。 Item.ItemType属性为null。

我认为这是因为,因为我的Item DTO类中没有ItemTypeID Guid值,并且我没有为Item DTO中的同名属性创建新的ItemType类,所以AutoMapper无法存储ItemType ID值。

我认为这取决于我的Automapper映射配置。

我确信这是一件我很容易忽视的事情。

提前感谢任何建议!

2 个答案:

答案 0 :(得分:2)

很确定这是因为automapper被设计为Big Shape-&gt;较小/平面形状的绘图工具,而不是相反。这是不受支持的。

答案 1 :(得分:1)

你应该可以说:

Mapper.CreateMap<ItemEditViewModel, Item>()
    .ForMember(dest => dest.ItemType, opt => opt.MapFrom(src =>
        {
            return new ItemType()
                {
                    ID = src.ItemTypeID
                }
        };