2011-06-15 29 views
3

我的DTO(簡化用於演示目的):Automapper映射問題:從壓扁到DTO作品視圖模型 - 不工作的其他方式

項目(DTO映射到我的問題視圖模型):

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

的ItemType(我的項目類引用):

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

我的視圖模型(編輯我的項目類數據):

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創建行動導致我的控制器在我使用Automapper將我的ItemEditViewModel映射到我的Item DTO類s時,在SelectList中選擇的ItemType ID值不會綁定到Item.ItemType.ID屬性。 Item.ItemType屬性爲null。

我認爲這是因爲我的Item DTO類中沒有ItemTypeID Guid值,並且我沒有在Item DTO中爲同名的屬性創建新的ItemType類,所以AutoMapper是無法存儲ItemType ID值。

我認爲這歸結於我的Automapper映射配置。

我確定這是簡單的,我俯瞰。

在此先感謝您的任何建議!

回答

2

很確定這是因爲automapper被設計成一個Big Shape-> Smaller/Flat Shape的映射工具,而不是相反。這只是不受支持。

+0

這是令人失望的。看起來好像在我的ViewModel到DTO的映射配置中,我可以指定一個ItemType類的構造函數,從ViewModel中綁定我選擇的ItemTypeID。我已經有一個ItemType的構造函數,它接受ID的Guid參數。現在,我修改了Create HttpPost ActionResult方法,通過使用構造函數將DTO的ItemType屬性設置爲新的ItemType對象:newItem.ItemType = new ItemType(itemVM.ItemTypeID); – hiro77 2011-06-15 18:24:01

1

你應該能夠說:

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