1

だから私はこれを持っています。

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それがデータコンテキストからプルされたときの状態にまだ設定されているということです。しかし、私はこれを行うのに苦労しています。

その場合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 {}ものが置き換えられ、基本的にクリアされます。ChildOtherChildProperty

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

これをマップして、無視したい子プロパティを保持するにはどうすればよいですか?

4

2 に答える 2

1

automapper を使用してフラット化プロセスを逆にしようとしていますが、それはジョブにとって間違ったツールです。このSOの質問を参照してください。

于 2012-07-18T09:15:27.503 に答える
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);
于 2012-07-19T07:07:23.503 に答える