が、私は2つのクラスがあるとし、子プロパティなどの特定の名前のプロパティを無視しますID(Company.IDおよびEmployee.ID)を除くすべてのフィールド。AutoMapperは
私はこれを処理するためにAutomapper拡張子を追加しました:
public static IMappingExpression<TSource, TDestination> IgnoreIDs<TSource, TDestination>(
this IMappingExpression<TSource, TDestination> expression)
{
var sourceType = typeof(TSource);
foreach (var property in sourceType.GetProperties())
{
if (property.Name.Contains("ID"))
expression.ForMember(property.Name, opt => opt.Ignore());
}
return expression;
}
私はそうのようにそれを呼び出す:
Mapper.CreateMap<Company, Company>().IgnoreIDs();
Mapper.CreateMap<Employee, Employee>().IgnoreIDs();
var mappedCompany = Mapper.Map(changedCompany, existingCompany);
会社レベル(mappedCompany.ID全くIDプロパティのこの作品 == existingCompany.ID、他のプロパティが変更されている間はchangedCompany.IDは期待通りに無視されます)。
しかし、このアプローチは子のプロパティでは機能しません。それは常にEmployee.IDをゼロに設定します! existingCompanyとchangedCompanyの従業員のプロパティにIDがある場合でも、 "ID"を含むフィールド名はすべて0に設定されます。その他のプロパティはすべて適切にマップされます。
なぜこれを行うのですか?プロパティを無視したりマッピングしたりするのではなく、デフォルトに設定していますか?
(AutoMapperのv3.3.1)
私はAutoMapperを使用したことはありませんが、あなたがsourceTypeをループするだけのプロパティをループしているところではあなたの関数です。子要素を無視するには、子要素をループする必要があると思います。 – Cory
最新バージョンでは、グローバル無視を使用します。 –
それは、子要素がまだ影響を受けているということです。予想された方法ではなく(無視されるのではなくゼロに変更されています)。従業員のプロパティは、2番目のCreateMapが呼び出されたときにループします。 – FBryant87