2

以下は私のクラスです

public class Student {
      public long Id { get; set; }
      public long? CollegeId { get; set; }
      public StudentPersonal StudentPersonal { get; set; }
    }   

    public class StudentPersonal {  
      public long? EthnicityId { get; set; }
      public bool? GenderId { get; set; }  // doesn't exist on UpdateModel, requires PropertyMap.SourceMember null check
    }   

    public class UpdateModel{
      public long Id { get; set; }
      public long? CollegeId { get; set; }
      public long? StudentPersonalEthnicityId { get; set; }
    }

以下はAutoMapper構成です

Mapper.Initialize(a => {
    a.RecognizePrefixes("StudentPersonal");
}

Mapper.CreateMap<UpdateModel, StudentPersonal>()
    .ForAllMembers(opt => opt.Condition(src => src.PropertyMap.SourceMember != null && src.SourceValue != null));
Mapper.CreateMap<UpdateModel, Student>()
    .ForMember(dest => dest.StudentPersonal, opt => opt.MapFrom(src => Mapper.Map<StudentPersonal>(src)))                                
    .ForAllMembers(opt => opt.Condition(src => src.PropertyMap.SourceMember != null && src.SourceValue != null));

そして、サンプル テスト ケース:

var updateModel = new StudentSignupUpdateModel();
updateModel.Id = 123;
updateModel.CollegeId = 456;
updateModel.StudentPersonalEthnicityId = 5;

var existingStudent = new Student();
existingStudent.Id = 123;
existingStudent.CollegeId = 777; // this gets updated
existingStudent.StudentPersonal = new StudentPersonal();
existingStudent.StudentPersonal.EthnicityId = null; // this stays null but shouldn't

Mapper.Map(updateModel, existingStudent);
Assert.AreEqual(777, existingStudent.CollegeId);  // passes
Assert.AreEqual(5, existingStudent.StudentPersonal.EthnicityId);  // does not pass

プレフィックスを操作するための条件付きマッピングを取得した人はいますか? 接頭辞が付いていないオブジェクトでも問題なく動作します。

4

1 に答える 1

0

あなたが渡しているラムダopts.Conditionはあまりにも制限的です:

src => src.PropertyMap.SourceMember != null && src.SourceValue != null

このプロパティの場合src.PropertyMapは、null毎回です (ソース オブジェクトから宛先のネストされたプロパティにマップされるプロパティは 1 つもないので、これは当然のことです)。

チェックを外すPropertyMap.SourceMemberと、テストに合格します。ただし、これが残りのマッピングにどのような影響を与えるかはわかりません。

于 2014-09-15T15:47:11.323 に答える