2011-08-25 139 views
14

我的对象不具有默认的构造函数,它们都需要添加以下行的如何使用Automapper构建对象,而默认的构造函数

new Entity(int recordid); 

签名:

Mapper.CreateMap<EntityDTO, Entity>().ConvertUsing(s => new Entity(s.RecordId)); 

这修复了Automapper需要默认构造函数的问题,但唯一映射的元素是记录ID。

我该如何获得它正常的映射?如何获取要映射的实体的所有属性而无需手动映射属性?

+0

RecordId从哪里来? EntityDTO?如果是这样,在AutoMapper.org上发现的AutoMapper的最新版本支持映射构造函数参数,这可能会帮助你。 –

+1

您需要使用ConstructUsing。 看[这个答案] [1]细节 [1]:http://stackoverflow.com/questions/2239143/automapper-how-to-map-to-constructor-parameters-instead属性设置器 – boca

回答

30

你可以使用ConstructUsing代替ConvertUsing。这里有一个演示:

using System; 
using AutoMapper; 

public class Source 
{ 
    public int RecordId { get; set; } 
    public string Foo { get; set; } 
    public string Bar { get; set; } 
} 

public class Target 
{ 
    public Target(int recordid) 
    { 
     RecordId = recordid; 
    } 

    public int RecordId { get; set; } 
    public string Foo { get; set; } 
    public string Bar { get; set; } 
} 


class Program 
{ 
    static void Main() 
    { 
     Mapper 
      .CreateMap<Source, Target>() 
      .ConstructUsing(source => new Target(source.RecordId)); 

     var src = new Source 
     { 
      RecordId = 5, 
      Foo = "foo", 
      Bar = "bar" 
     }; 
     var dest = Mapper.Map<Source, Target>(src); 
     Console.WriteLine(dest.RecordId); 
     Console.WriteLine(dest.Foo); 
     Console.WriteLine(dest.Bar); 
    } 
} 
+0

ConvertUsing为从视图模型到模型的映射提供了更大的灵活性。有什么办法可以使用ConstructUsing和ConvertUsing?我只想映射一些属性,当从viewModel映射到具有构造函数的模型时,但是当从模型映射到视图模型时,所有属性都应该映射。 – akd

8

尝试

Mapper.CreateMap<EntityDTO, Entity>().ConstructUsing(s => new Entity(s.RecordId));