14

私は簡単な更新機能を持っています:

public void Update(Users user)
{
    tblUserData userData = _context.tblUserDatas.Where(u => u.IDUSER == user.IDUSER).FirstOrDefault();
    if (userData != null)
    {
        Mapper.CreateMap<Users, tblUserData>();
        userData = Mapper.Map<Users, tblUserData>(user);
        _context.SaveChanges()
    }
}

userData は EF エンティティであり、エンティティ キー プロパティは null になります。これは、宛先オブジェクトには存在するが、ソース オブジェクトには存在しないため、デフォルト値でマップされるためです (エンティティ キーの場合は null です)。 )

私の質問は、ソース オブジェクトと宛先オブジェクトの両方に存在するプロパティのみをマッピングするように Automapper を構成できるかということです。エンティティ キーやナビゲーション プロパティなどは飛ばしてほしい。

4

4 に答える 4

10

AutoMapper次のように、必要に応じてIgnore特定のプロパティに明示的に伝えることができます。

Mapper.CreateMap<Users, tblUserData>()
        .ForMember(dest => dest.Id, opt => opt.Ignore());

これは、宛先オブジェクトの Id 列が常に変更されないことを意味します。

次のように、このオプションを使用してCondition、論理条件の結果に応じてマッピングを適用するかどうかを指定できます。

Mapper.CreateMap<Users, tblUserData>()
        .ForMember(dest => dest.Id, opt => opt.Condition(src=>src.Id.HasValue));

また

Mapper.CreateMap<Users, tblUserData>()
        .ForMember(dest => dest.Id, opt => opt.Condition(src=>src.Id != null));

特定の要件に応じて。

于 2013-06-17T12:11:32.183 に答える
7

それ以外の

userData = _mapper.Map<Users, tblUserData>(user);

使用する

 _mapper.Map(user, userData);

前者は、ユーザー オブジェクトで使用可能なプロパティのみを持つ新しい userData オブジェクトを作成します。後者は、既存の userData オブジェクトのプロパティをユーザー オブジェクトに存在するプロパティで上書きし、残りは保持します。

于 2020-12-17T21:26:15.063 に答える
5

ターゲット型に存在しないすべてのプロパティを無視する小さな拡張メソッドを作成することで、この動作をオーバーライドできます。

public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
{
    var sourceType = typeof(TSource);
    var destinationType = typeof(TDestination);
    var existingMaps = Mapper.GetAllTypeMaps().First(x => x.SourceType.Equals(sourceType)
        && x.DestinationType.Equals(destinationType));
    foreach (var property in existingMaps.GetUnmappedPropertyNames())
    {
        expression.ForMember(property, opt => opt.Ignore());
    }
    return expression;
}

次に、次のようにマッピングを行うことができます。

Mapper.CreateMap<SourceType, DestinationType>().IgnoreAllNonExisting();

たとえば、保護されたセッターまたはプライベート セッターを持つプロパティを特に無視することにより、このメソッドをニーズに合わせてカスタマイズすることもできます。

于 2017-10-29T18:25:17.617 に答える