AutoMapper - 嵌套映射,同时保留选定的子属性

时间:2012-07-18 08:59:00

标签: c# c#-4.0 automapper automapper-2

所以我有这个;

public class Parent
{
  public string SomeProperty { get; set; }
  public Child ChildProperty { get; set; }
}
public class Child
{
  public string ChildProperty { get; set; }
  public string OtherChildProperty { get; set; }
}
public class Flat
{
  public string SomeProperty { get; set; }
  public string ChildProperty { get; set; }
}

然后我这样做;

Flat source = new Flat { SomeProperty = "test", ChildProperty = "test" };
Parent dest = GetParentFromDataContext();

Mapper.Map<Flat,Parent>(source,dest);

然后我的期望是dest.ChildProperty.OtherChildProperty仍然设置为从datacontext中提取它时的任何内容。但是我很难做到这一点。

如果我CreateMap如此,那么我会得到“必须解决顶级成员”的例外情况;

Mapper.CreateMap<Flat,Parent>()
  .ForMember(dest => dest.Parent.ChildProperty.ChildProperty,
    options => options.MapFrom(source => source.ChildProperty))
  .ForMember(dest => dest.Parent.ChildProperty.OtherChildProperty,
    options => options.Ignore());

但是,如果我执行以下操作,则new Child {}将替换从datacontext中提取的Child,基本上清除OtherChildProperty;

Mapper.CreateMap<Flat,Parent>()
  .ForMember(dest => dest.Child
    options => options.MapFrom(source => new Child { ChildProperty = source.ChildProperty } ));

我如何映射这个并保留我想忽略的子属性?

2 个答案:

答案 0 :(得分:1)

您正尝试使用automapper来反转展平过程,这只是该作业的错误工具。请参阅this SO问题。

答案 1 :(得分:1)

不雅,但这很有效;

Mapper.CreateMap<Flat,Parent>()
  .ForMember(dest => dest.ChildProperty, options => options.Ignore());
Mapper.CreateMap<Flat,Child>()
  .ForMember(dest => dest.OtherChildProperty, options => options.Ignore());

Mapper.Map<Flat,Parent>(source,dest);
Mapper.Map<Flat,Child>(source,dest.Child);