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

时间:2016-08-19 13:46:06

标签: c# .net orm object-object-mapping

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

但是,我还没有找到编写如何执行此操作的列表的文章或资源。到目前为止,我发现了以下内容:

  • 隐式转换(我认为这是最基本的方法?因为你手动将属性从一个对象映射到另一个对象,它简单但乏味)
  • 扩展方法(尚未使用此方法)
  • 反思(我已经修改了一下,但只管理了非常基本的映射)
  • Automapper(非常受欢迎,但我在使用EF时遇到问题)
  • 价值注入(尚未与此合作)
  • 发射映射器(尚未使用过它,但可能我在使用EF时遇到麻烦?)

你能帮助指出并详细说明那里可用的方法,以及每种方法的优点/缺点吗?例如,我看到一些提到的Automapper与手动映射相比速度慢?或者可能指出一篇解决这个问题的文章?

编辑:因为有些人可能会问我在AutoMapper上遇到了什么问题,请看:Automapper: How to map IList to EntityCollection

1 个答案:

答案 0 :(得分:4)

好吧,我可以为您提供一种方法,您可以自己进行映射,操作非常简单,并且可以在大量数据上快速执行。我会告诉你我会做什么,然后试着详细说明我为什么做我做的事情。这是:

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&gt;的第一个用于在Select()语句中转换大量对象。简单用法:

return people.Select(PersonViewModel.FromPerson);

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

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