web-dev-qa-db-ja.com

自動マッパーマップされていないメンバーが見つかりました

プロジェクトにAutomapperを使用していますが、次のエラーがランダムに発生するようです。

AutoMapper.AutoMapperConfigurationException:マップされていないメンバーが見つかりました。以下のタイプとメンバーを確認してください。カスタムマッピング式の追加、無視、カスタムリゾルバーの追加、またはソース/宛先タイプの変更

コードは数か月間変更されていません。エラーが発生し、更新するとエラーがなくなり、ページは正常に機能します。私は使っています

Mapper.AssertConfigurationIsValid();

マッピングが良くないという不満の理由がわからず、リフレッシュして再び元気になりますが、これに遭遇した人はいますか?デバッグはランダムであり、エラーが発生しないこともあれば、サイトのどこかにポップアップして戻ってきても問題ないため、デバッグは役に立ちません。エラーは、同じページではなく、同じマッピングではなく、ランダムなページでも発生します。

49
Paritosh

簡単なイントロ編集:@mrTurkayが以下に答えるように、これは次の設定で解決できます:

cfg.ValidateInlineMaps = false;

ただし、そもそも問題が発生する理由を理解する必要があります。お読みください。

この問題は、マッピング構成を作成しなかったオブジェクトをマップしようとしたときに発生します。覚えておく必要があるのは、マップしようとしている特定のオブジェクトである必要はないということです。ただし、ナビゲーションプロパティの1つです。

たとえば、Car.csにマッピングするCarDTO.csがあるとします

Car.csは次のようになります。

public class Car
{
  public string Color { get; set; }

  public Engine Engine { get; set; }
}

DTOは同じように見えますが、代わりにEngineDTOへの参照があります。

public class CarDTO
{
  public string Color { get; set; }

  public EngineDTO Engine { get; set; }
}

次のようにマッピングを構成しました。

    Mapper.CreateMap<DTO.CarDTO, Data.Model.Car>();
    Mapper.CreateMap<Data.Model.Car, DTO.CarDTO>();

    Mapper.CreateMap<DTO.EngineDTO, Data.Model.Engine>();
    Mapper.CreateMap<Data.Model.Engine, DTO.EngineDTO>();

すべてが正常に見えますか?ただし、EngineDTOには、おそらく次のようなナビゲーションプロパティがあります。

public class EngineDTO
{
public List<PartDTO> Parts { get; set; }
}

AutomapperがEngineからEngineDTOにマッピングしている間、PartDTOもマッピングしようとしますが、global.asaxでマッピングを宣言するのを忘れたため、エラーが発生します:

AutoMapper.AutoMapperConfigurationException:マップされていないメンバーが見つかりました。以下のタイプとメンバーを確認してください。カスタムマッピング式の追加、無視、カスタムリゾルバーの追加、またはソース/宛先タイプの変更

クラスの特定のプロパティをマップしたくない場合は、無視を使用できます。

Mapper.CreateMap<Engine, EngineDTO>()
    .ForMember(x => x.Parts, opt => opt.Ignore());

編集:

より堅牢なAutoMapper構成のために、Global.asaxで直接マッピングを宣言するのではなく、マッピングプロファイルを使用することをお勧めします。次に例を示します。

プロフィール:

public class CarProfile : Profile
{
    public CarProfile ()
    {
        CreateMap<Car, CarDTO>();
    }
}

Global.asax:

Mapper.Initialize(cfg =>
{
     cfg.AddProfile<CarProfile>();
}
57
MichaelCleverly

検証についてです。

cfg.ValidateInlineMaps = false;

十分なはずです

15
mrTurkay