Как отобразить DTO из EF в модель - PullRequest
1 голос
/ 01 января 2012

У меня есть следующая модель Person в моем слое MVC пользовательского интерфейса:

public class Person
{
     [Required]
     public string FirstName { get; set; }

     [Required]
     public string LastName { get; set; }

     public int PersonTypeID { get; set; }

     [Required]
     public string Phone { get; set; }

     [Required]
     public string Email { get; set; }

}

В моем слое данных у меня есть класс с такими же именами свойств, но разными мета (естественно):

public partial class Person : EntityObject { ... }

Как я могу вернуть данные со своего уровня данных на свой уровень пользовательского интерфейса MVC, не имея уровня данных о слое пользовательского интерфейса MVC?

Примечание. У меня также есть простой интерфейс IPerson с тем же свойствомИмена.

Ответы [ 3 ]

4 голосов
/ 01 января 2012

Вы можете использовать AutoMapper для сопоставления между моделью домена и моделью представления.Это уровень MVC, который знает об уровне данных, но уровень данных не должен знать о уровне MVC.

Вот общий шаблон:

public ActionResult Foo()
{
    var person = _repository.GetPerson();
    var personViewModel = Mapper.Map<Person, PersonViewModel>(person);
    return View(personViewModel);
}

и другиенаоборот:

[HttpPost]
public ActionResult Foo(PersonViewModel personViewModel)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }
    var person = Mapper.Map<PersonViewModel, Person>(personViewModel);
    _repository.UpdatePerson(person);
    return RedirectToAction("Success");
}

Как видите, уровню данных не нужно ничего знать о уровне MVC.Это уровень MVC, который должен знать об уровне данных.

1 голос
/ 01 января 2012

Я бы предложил вам ознакомиться с фреймворком, таким как automapper , который дает вам возможность легко выполнять сопоставление объекта с объектом.

0 голосов
/ 15 января 2013

Другая опция CX.Mapper очень проста в использовании и вам не нужно предварительно настраивать карту:

[HttpGet]
public ActionResult Edit(int id)
{
  var item = this.db.Items.Find(id);
  var model = CX.Mapper.Mapping.MapNew<Item, ItemDto>(item);
  return View(model);
}

[HttpPost]
public ActionResult Edit(ItemDto model)
{
  if(Model.IsValid)
  {
    var item = this.db.Items.Find(ItemDto.Id);
    CX.Mapper.Mapping.Map<ItemDto, Item>(model, item);
    this.db.SaveChanges();
    return RedirectToAction("Index");
  }
  return View(model);
}

Вы можете установить с NuGet

...