AutoMapper и отображение один-ко-многим при создании - PullRequest
1 голос
/ 30 марта 2011

Таким образом, моя БД имеет связь «один ко многим» между клиентом и заказами.
Сопоставление данных для отображения клиента и его заказов не представляет проблемы.Но есть ли способ сопоставить их при создании клиента?

Например: «Самая базовая модель представления просто для проверки сопоставления»

public class CVM  
{  
    public string ContactName { get; set; }  //Part of the Customer Table  
    public DateTime OrderDate { get; set; }  //Part of the Orders Table and 
    //would have to be passed into the Orders List of the EF-Customer-Object  
}

Таким образом, представление создания просто имеет 2 входа для Имени и Даты.«Очень простой контроллер для проверки соответствия;)»

[HttpPost]  
public ActionResult Create(CVM model)  
{  
    Mapper.CreateMap<CVM, Customer>();  
    Customer customer = Mapper.Map<CVM, Customer>(model);  
    return View();  
}

Таким образом, ContactName отображается правильно.Проблема заключается в дате заказа.AutoMapper должен будет создать экземпляр Order, установить значение OrderDate и передать его в OrdersCollection объекта Customer.Может ли AutoMapper сделать это или я совершенно не прав?

Надеюсь, вы понимаете мое объяснение, и у меня есть Ответ на меня.

Спасибо, ребята

1 Ответ

1 голос
/ 30 марта 2011

Я думаю, вы поступаете неправильно.Вам следует создать экземпляр Customer и затем сопоставить его свойства с помощью AutoMapper.

Таким образом, ваш код будет выглядеть так:

[HttpPost]  
public ActionResult Create(CVM model)  
{  
    Mapper.CreateMap<CVM, Customer>();
    Customer customer = /* Construct or get a Customer instance, eg from DB. */
    Mapper.Map<CVM, Customer>(model, customer);  
    return View();  
}

Кстати, вы должны сделатьобязательно иметь директивы Mapper.CreateMap<CVM, Customer>() только во время запуска приложения, в противном случае вы будете выполнять этот (возможно, дорогостоящий) шаг без необходимости при каждом запросе.

Редактировать

Кажется, я неправильно прочитал исходный вопрос.Если цель состоит в том, чтобы создать клиента со связанными объектами, тогда Automapper может помочь вам несколькими различными способами (я собираюсь продолжить с примером Person / PhoneNumber, который вы привели в комментариях).

Учитывая, что ваши сущностии View Models:

public Person {
  public string Name { get; set; }
  public string List<PhoneNumber> Numbers { get; set; }
}

public PersonVM {
  public string Name { get; set; }
  public string IList<PhoneNumberVM> Numbers { get; set; }
}

public PhoneNumber {
  public int Type { get; set; }
  public string Number { get; set; }
}

public PhoneNumberVM {
  public int Type { get; set; }
  public string Number { get; set; }
}

, тогда у вас есть несколько альтернатив:

  1. Вы можете попробовать написать пользовательское правило отображения так, чтобы каждый экземпляр PhoneNumberVM отображался наPhoneNumber экземпляр или
  2. Вы можете добавить Mapper.CreateMap<PhoneNumberVM, PhoneNumber>() и просто позвонить Mapper.Map<PersonVM, Person>(model), чтобы привязать вашу модель к вашей сущности.

Конечно, вам придетсяубедитесь, что ваша модель построена правильно, но это не так сложно, если вы используете ту же модель для создания HTML-формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...