3

単純なモデルをエンティティにマップしようとしていますが、予期していなかったマップされていないアイテムのリストを取得します。AutomapperCfg の検証行で失敗します。

SaveImportRunDetailsModel -> ImportRunDetailEntity (宛先メンバー リスト) FCSD.Models.SaveImportRunDetailsModel -> LLBLGEN.EntityClasses.ImportRunDetailEntity (宛先メンバー リスト)

マップされていないプロパティ:

Id
ConcurrencyPredicateFactoryToUse
AuthorizerToUse
AuditorToUse
Validator
ActiveContext
IsNew
Fields
IsDirty

これらはシステム生成アイテムのように見えますが、それらを閉じる方法はありますか?

AutomapperCfg.cs は

using AutoMapper;
using FCSD.Models;
using LLBLGEN.EntityClasses;

namespace FCSD.Automapper
{
    public class AutomapperCfg : IAutomapperCfg
    {
        public void Configure()
        {
            Mapper.Initialize(cfg =>
            {
                cfg.CreateMap<CategoryEntity, Category>(MemberList.Destination);
                cfg.CreateMap<EnglishPartInfoEntity, EnglishPartModel>(MemberList.Destination);
                cfg.CreateMap<ImageEntity, Image>(MemberList.Destination);
                cfg.CreateMap<ImportRunDetailEntity, ImportRunDetailModel>(MemberList.Destination);
                cfg.CreateMap<ModelExportBaseEntity, Model>(MemberList.Destination).ReverseMap();
                cfg.CreateMap<PartEntity, Part>(MemberList.Destination);

                cfg.CreateMap<SaveImportRunDetailsModel, ImportRunDetailEntity>(MemberList.Destination);
            });

            Mapper.AssertConfigurationIsValid();
        }
    }
}

SaveImportRunDetailsModel は

using System;

namespace FCSD.Models
{
    public class SaveImportRunDetailsModel
    {
        public string PHCreationDate { get; set; }
        public DateTime RunTimestamp { get; set; }
    }
}

最後に、ImportRunDetailEntity は少し長く (400 行以上)、LLBLGen Pro から c# で自動生成されます。

4

1 に答える 1

1

何が起こっていますか

ソースのプロパティと一致しないプロパティが目的の型に含まれている場合、そのプロパティを埋める方法が明示的に指示されていない場合、AutoMapper は例外をスローします。

修正方法

AutoMapper にプロパティを入力させたくない場合はCreateMap<TSource, TDest>()、各フィールドを無視するために、 の戻り値でこの拡張メソッドを使用する必要があります。

 .ForMember(dest => dest.Id, opt => opt.Ignore())
 .ForMember(dest => dest.ConcurrencyPredicateFactoryToUse, opt => opt.Ignore())
 .ForMember(dest => dest.AuthorizerToUse, opt => opt.Ignore());

等々。

しかし、それはひどいです...

明らかに、これは少し面倒で、AutoMapper から「自動」を取り出します。そのため、このAutoMapper のようなものを検討することをお勧めします:「残りを無視しますか?」- ソース オブジェクトに存在しないすべての宛先メンバーを自動的に無視します。

もう一つ

すべてのマッピングを使用してインスタンスを構成する単体テストを作成し、実行時ではなくテスト時Mapperに呼び出しMapper.AssertConfigurationIsValid()て問題を発見することができます。デフォルトでは、AutoMapper は最初にマッピングを試行するまでマッピングを検証しません。これを使って。

于 2015-08-10T11:52:23.940 に答える