2016-08-19 83 views
1

我需要做一些对象之间的映射(例如PersonModel到PersonViewModel),并且正在研究不同的方法来做到这一点。具体来说,我正在使用实体框架并尝试将生成的模型映射到视图模型。.NET中的对象 - 对象映射有哪些不同的方法?

但是,我还没有找到一篇文章或资源来编译你如何做到这一点。到目前为止,我遇到了以下几点:

  • 隐式转换
  • 扩展方法(我认为这是最基本的方法,因为您手动从一个对象到另一个,它简单而繁琐的映射属性?) (有没有跟这个工作还)
  • 反射(我已经修修补补了一点,但只有管理非常基本的映射)
  • Automapper(很受欢迎,但我无法使其与EF很好地工作)
  • 超值注射器(尚未与此合作)
  • 的Emit映射器(也没有这个工作还没有,但可能我会有麻烦使其与EF工作?)

能否请你帮指出并阐述有可用的方法,以及利弊/每个的利弊?例如,我看到一些提到的Automapper比手动映射慢?或者可能指出一篇文章解决这个问题?

编辑:因为有些人可能会问我有什么问题AutoMapper,请参阅本:Automapper: How to map IList to EntityCollection

+0

你在问整本文章甚至书本章节。 SO是一个问答网站。并且Automapper在使用EF时没有问题,主要是因为EF返回的对象是普通的旧对象。如果你使用EF特定的类,比如'EntityCollection',你做错了。检查所有教程,你会看到他们使用最基本的'ICollection ' –

回答

2

好吧,我可以给你一个方法,你做你自己的映射,很简单的事,并且可以迅速地执行超过大量的数据。我会告诉你我会做什么,然后试着阐述我为什么要做我所做的事情。这里有:

public class PersonViewModel 
{ 
    public static Expression<Func<Person, PersonViewModel>> FromPerson 
    { 
     get 
     { 
      return p => new PersonViewModel 
      { 
       Name = p.FirstName, 
       SurName = p.LastName 
      }; 
     } 
    } 

    public string Name { get; set; } 
    public string SurName { get; set; } 
    public static PersonViewModel CreateViewModel(Person original) 
    { 
     var func = FromPerson.Compile(); 
     var vm = func(original); 

     return vm; 
    } 
} 

现在你会注意到我有2种方法从Person EF模型转换到ViewModel。这是因为使用Expression>的第一个用于在Select()语句中转换大量对象。简单的用法:

return people.Select(PersonViewModel.FromPerson); 

在这种情况下,我们可能已经检索到的人的集合,从数据库对象,并需要向他们展示,比如说,在一个列表或东西,但使用的视图模型。通过这种方式,操作是批量执行的,比通过其他方法创建所有对象要快得多。现在,可以使用静态CreateViewModel方法在需要的地方映射单个对象。一个例子是,如果您从数据库获取单个用户的数据并需要显示它,但使用ViewModel。在这种情况下,应该使用静态方法,而不是主要用于批量转换的表达式。

这就是我所能提供的,除了想知道使用AutoMapper有什么问题,因为它非常简单,而且您还没有详细阐述与EF一起使用时的问题。希望这可以帮助你至少在你的问题一点:)

+0

我建议'CreateViewModel'将使用'FromPerson'来减少代码重复。几乎任何现实生活中的映射都会有更多的属性,所以应用DRY(不要重复自己)原则是有道理的。 – Phil1970

+0

啊,你是对的,我实际上已经忘记了,因为我在飞行中写了它,感谢修正,将会修复它。 –