2012-01-01 101 views
1

我有我的UI MVC层以下的模型人:如何从EF映射DTO到模型

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 UI层从我的数据层到我的MVC UI层的数据?

注意:我也有一个简单的具有相同属性名称的IPerson接口。

回答

4

您可以使用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

我这个看到的唯一问题是,如果你需要切换您的数据实现(例如,从EF到Linq到SQL)。现在你的MVC层需要Person对象,这个对象只与EF绑定。 – 2012-01-01 19:23:37

+0

@BrianDavidBerman,好吧,没有奇迹的解决方案。最好的办法是有一个不侵入的ORM框架,并允许你映射你的实际域对象,这样你就不会得到一些自动生成和污染的类。据我所知这可能与EF。最好的解决方案是拥有纯粹的域业务实体,这些实体不是特定于某些数据访问框架,而是特定于业务需求。 – 2012-01-01 19:27:19

1

我会邀请您回顾一个框架,如automapper,它使您能够轻松地执行对象到对象的映射。

0

其他选项是CX.Mapper使用起来非常简单,你不需要precofig地图:

[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安装