.NET中的对象-对象映射有哪些不同的方法?

blo*_*004 5 .net c# orm object-object-mapping

我需要在对象之间进行一些映射(例如PersonModel到PersonViewModel),并正在研究实现此目的的不同方法。具体来说,我正在使用实体框架,并尝试将生成的模型映射到视图模型。

但是,我还没有找到有关如何执行此操作的列表的文章或资源。到目前为止,我遇到了以下问题:

  • 隐式转换(我认为这是最基本的方法?因为您手动将属性从一个对象映射到另一个对象,这很简单但很乏味)
  • 扩展方法(尚未使用)
  • 反射(我做了一些修改,但仅管理非常基本的映射)
  • Automapper(非常受欢迎,但是我无法使其与EF一起正常工作)
  • Value Injecter(尚未与此一起工作)
  • Emit Mapper(尚未使用它,但可能无法使其与EF一起使用?)

您能否帮忙指出并详细说明现有的方法以及每种方法的利弊?例如,我看到有人提到Automapper与手动映射相比速度较慢?还是可能指出解决此问题的文章?

编辑:由于某些人可能会问我AutoMapper有什么问题,请参见:Automapper:如何将IList映射到EntityCollection

Kon*_*ery 5

好吧,我可以给你一种方法,让你自己做映射,做起来非常简单,并且可以在大量数据上快速执行。我会告诉你我会做什么,然后尝试详细说明我为什么要这样做。开始:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

return people.Select(PersonViewModel.FromPerson);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们可能已经从数据库中检索了一组 Person 对象,并且需要使用 ViewModel 将它们显示在列表或其他内容中。通过这种方式,操作是批量执行的,并且比通过其他方法简单地创建所有对象要快得多。现在,静态 CreateViewModel 方法可用于在需要的地方映射单个对象。一个例子是,如果您从数据库中获取了单个用户的数据并需要显示它,但使用的是您的 ViewModel。在这种情况下,最好使用静态方法,而不是主要用于批量转换的表达式。

这就是我可以提供的,除了想知道使用 AutoMapper 有什么问题之外,因为它非常简单,而且您还没有真正详细说明将它与 EF 一起使用的问题是什么。希望这对您的问题至少有一点帮助:)