2017-08-24 50 views
2

我有以下类别:如何使用AutoMapper将父母映射到孩子?

public class Parent { 
    string id; 
    Child child; 
} 

public class Child { 
    string Name; 
} 

基本上我想办一个Automapper配置,让我到父映射到儿童。我怎样才能做到这一点 ?

var parent = GetParent(); 
var child = Mapper.Map<Child>(parent); 

是否有可用的做到这一点的方法,而无需使用

.ForMember(d=> d.Name, o=> o.MapFrom(src => src.child.Name)); 

原因映射成员一个接一个:

1)有多个成员在孩子和创建多个.ForMembers ()似乎凌乱。

2)使用Mapper.Map()而不是直接访问对象,因为这是使用映射配置完成的父级通用提供程序类。

回答

1

在所提供的简单的情况下,

.ProjectUsing(x => x.Child) 

要做到你想在这里做什么。

示例代码如下 - 我已在孩子中包含一个Id来验证只有来自Parent.Child的字段将映射到新孩子。

请注意,这不会与.MapFrom()相结合 - 因此,如果您有,例如,孩子的ParentId属性,您需要做一些额外的手动映射,以从父级到孩子。

关于多个.ForMember()看似凌乱 - 同意如果您有大量映射正在进行,它可能会堆积如山,但根据我的经验,这可以有助于防止重命名重构破坏映射。强烈鼓励使用configuration validation单元测试来确保这样的重构不会破坏您的映射。希望有所帮助!

class Program 
{ 
    static void Main(string[] args) 
    { 
     Mapper.Initialize(MapperConfiguration); 

     var parent = new Parent() 
     { 
      Id = "a", 
      Child = new Child() 
      { 
       Name = "ChildA", 
       Id = 1 
      } 
     }; 

     var child = Mapper.Map<Child>(parent); 

     Console.Read(); 
    } 

    private static void MapperConfiguration(IMapperConfigurationExpression mapper) 
    { 
     mapper.CreateMap<Parent, Child>() 
      .ProjectUsing(x => x.Child); 
    } 

    public class Parent 
    { 
     public string Id { get; set; } 
     public Child Child { get; set; } 
    } 

    public class Child 
    { 
     public string Name { get; set; } 
     public int Id { get; set; } 
    } 
} 
相关问题