2013-06-17 7 views
10

私は簡単な更新機能を持っている:Automapper - ソースオブジェクトと宛先オブジェクトの既存のプロパティのみにマップできますか?

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のエンティティであり、そしてそれはエンティティのキ​​ープロパティは、私は信じている、ので、うちゼロに取得しています、それはそう、先のオブジェクトではなく、ソースオブジェクトに存在します

したがって、私の質問は、ソースオブジェクトと宛先オブジェクトの両方に存在するプロパティをマップするようにAutomapperを構成できますか?エンティティキーやナビゲーションのプロパティをスキップするようにしたいと思います。このように、必要に応じて

答えて

8

明示的AutoMapperIgnoreに特定のプロパティを伝えることができます:宛先オブジェクトのidカラムを意味します

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

は常に放置されます。

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)); 

はあなたの特定に応じて:

あなたはこのように、論理条件の結果に応じて、マッピングが適用されるかどうかを指定するには、Conditionオプションを使用することができます要件。

+2

私のエンティティごとに無視するプロパティのリストを明示的に作成する必要があります。私の場合、私にとっては、 "欲張りな"マッピングを無効にし、AutoMapperにソースオブジェクトと宛先オブジェクトのプロパティを比較させ、両方に存在するプロパティに対してのみマップする方法があるでしょう。私はドキュメントでこのようなオプションは見つからなかったので、私はここで尋ねると思ったが、私はAutoMapperがこのように動作するとは思わない。 –

+0

私はあなたが適用したいルールを理解しています:「私のソースプロパティがnullでなく、デスティネーションプロパティがnullでなく、ソースをデスティネーションにマップする」が、このロジックをすべての人にグローバルに適用することはできないと思います私が上で行ったように、明示的にそれぞれの条件を作成することなく、 – CSL

+3

私が適用したいルールは、「ソースプロパティがデスティネーションに存在し、ソースをデスティネーションにマップし、デスティネーション内の他のすべてのプロパティを無視する」というルールですが、無視を作成する必要があるという点で正しいと思いますあなたが指示した通りの条件。 –

4

あなたは、このようにマッピングされたくないフィールドを無視するAutoMapperを伝えることができます。

userData = Mapper.Map<Users, tblUserData>(user).ForMember(m => m.EntityKey, opt => opt.Ignore()); 
1

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

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(); 

ために、特別に保護またはプライベートセッターを持つプロパティを無視して、自分のニーズに、この方法をカスタマイズすることも可能です例。

関連する問題