Проблема с отображением Automapper: сглаживание от DTO до ViewModel работает - не работает наоборот - PullRequest
3 голосов
/ 15 июня 2011

Мои 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 (на который ссылается мой класс 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);
    }
}

Код сопоставления My 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, значение идентификатора ItemType, выбранное в SelectList, не привязывается к свойству Item.ItemType.ID. Свойство Item.ItemType имеет значение null.

Я предполагаю, что это потому, что, поскольку у меня нет значения ItemTypeID Guid в моем классе Item DTO, и я не создал новый класс ItemType для свойства с тем же именем в моем Item DTO, AutoMapper не может сохранить значение идентификатора ItemType.

Я думаю, что все сводится к моей конфигурации сопоставления Automapper.

Я уверен, что это что-то простое, что я пропускаю.

Заранее спасибо за любой совет!

Ответы [ 2 ]

2 голосов
/ 15 июня 2011

Уверен, это потому, что automapper был разработан как инструмент отображения Big Shape-> Smaller / Flat Shape, а не наоборот. Это просто не поддерживается.

1 голос
/ 07 июля 2011

Вы должны быть в состоянии сказать:

Mapper.CreateMap<ItemEditViewModel, Item>()
    .ForMember(dest => dest.ItemType, opt => opt.MapFrom(src =>
        {
            return new ItemType()
                {
                    ID = src.ItemTypeID
                }
        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...