web-dev-qa-db-ja.com

AutoMapper.Mapper.CreateMap <TSource、TDestination>() 'は廃止されました

私はクラスのようにしなければなりません

class A
{
 public int id {get; set;}
}

class B
{
 public C c {get; set;}
}

class C
{
 public int id {get; set;}
 public string Name {get; set;}
}

私の要件は、クラスAのidをクラスCのidにマッピングすることです。 > x.id));;

そしてそれはうまく働いていた。

自動マッパーが実装を変更したようです。そして、私は次のように警告を受けています:

AutoMapper.Mapper.CreateMap() 'は廃止されました:'動的に作成するマップはバージョン5.0では削除されます。 MapperConfigurationインスタンスを使用して、必要に応じて静的に保存するか、Mapper.Initializeを保存します。 CreateMapperを使用して、マッパーインスタンスを作成します。

名前と構造が異なるクラスのいくつかのプロパティをマップする必要があります。これに関するヘルプ。

14
Sharad

以前

  Mapper.CreateMap<Src, Dest>()
 .ForMember(d => d.UserName, opt => opt.MapFrom(/* ????? */));

ここでの問題は、マッピング定義が静的であり、一度定義され、アプリケーションのライフタイムを通じて再利用されることです。 3.3より前では、ハードコーディングされた値を使用して、すべてのリクエストでマッピングを再定義する必要があります。また、マッピング構成はマッピングの実行とは別の場所に作成されるため、構成にランタイムパラメーターを導入し、実行中に指定する方法が必要です。

これは、実行時パラメーターを作成するマッピング定義と、実行時にパラメーターを提供するという2つの部分で実現されます。ランタイムパラメーターを使用してマッピング定義を作成するには、名前付きローカル変数を含むクロージャーを「偽造」します。

Mapper.Initialize(cfg => {

string userName = null;
cfg.CreateMap<Source, Dest>()
    .ForMember(d => d.UserName, 
        opt => opt.MapFrom(src => userName)
    );
});

詳細については こちらをご覧ください

1つ以上のクラス

 cfg.CreateMissingTypeMaps = true;
 cfg.CreateMap<Source, Dest>()
    .ForMember(d => d.UserName, 
        opt => opt.MapFrom(src => userName)
    );

 cfg.CreateMap<AbcEditViewModel, Abc>();
 cfg.CreateMap<Abc, AbcEditViewModel>();
});

マッピングクラス

  IMapper mapper = config.CreateMapper();
  var source = new AbcEditViewModel();
  var dest = mapper.Map<AbcEditViewModel, Abct>(source);
25
Anik Saha

もう少しきれいに思える別の方法は、AutoMapperのProfileクラスを継承するMappingProfileクラスを作成することです

_public class MappingProfile:Profile
{
    public MappingProfile()
    {
        CreateMap<Source1, Destination1>();
        CreateMap<Source2, Destination2>();
        ...
    }
}
_

次に、スタートアップコードでMapper.Initialize(c => c.AddProfile<MappingProfile>());を使用してマッピングを初期化します。

を呼び出すことで、どこでもマッピングを使用できるようになります

_destination1Collection = source1Collection.Select(Mapper.Map<Source1, Destination1>);
_
0
Leonard Lay

最後に、解決策を見つけました。 App_startで_Mapper.Initialize{ Mapping field from source to destination }_を実行し、このファイルをglobal.asax-> Application_Start()-> GlobalConfigurationに追加しました。

_cfg.CreateMissingTypeMaps = true;_であるMapper.Initialize内にもう1行追加する必要があります

これで、このコードは、2つのクラスが同じ構造とプロパティ名を持たない明示的なマッピングで機能します。

これとは別に、同じ構造を持つ2つのクラスのプロパティをマップする必要がある場合、コードMapper.map(source, destination)も機能しますが、以前は機能していませんでした。

誰かがソリューションに問題を抱えているかどうかを教えてください。上記の返信に感謝します。

0
Sharad