2017-05-14 4 views
0

Tagクラスと、TagからTagDtoにマップする対応するTagDtoクラスがあります。Automapper - ネストされた型のAutoMapperMappingExceptionとNullReferenceException

私はEFコアを使用しているため、多対多の関係を表すMoneyItemTagというクラスへのコレクションがあります。ここで

は私のクラスです:

public abstract class MoneyItemBase 
{ 
    public int Id { get; set; } 

    public string ItemText { get; set; } 

    public decimal Amount { get; set; } 

    public MoneyItemType MoneyItemType { get; protected set; } 

    public ICollection<MoneyItemTag> MoneyItemTags { get; set; } 
} 

public class MoneyItemTag 
{ 
    public int MoneyItemId { get; set; } 

    public MoneyItemBase MoneyItem { get; set; } 

    public int TagId { get; set; } 

    public Tag Tag { get; set; } 
} 

public class Tag 
{ 
    public int TagId { get; set; } 

    public string TagName { get; set; } 

    public ICollection<MoneyItemTag> MoneyItemTags { get; set; } 
} 

[Fact] 
    public void Tag_TagDto_Mapping() 
    { 
     Mapper.Initialize(cfg => 
     { 
      //cfg.AddProfile<MappingProfile>(); 
      cfg.CreateMap<Tag, TagDto>() 
       .ForMember(x => x.MoneyItems, opts => opts.MapFrom(src => src.MoneyItemTags.Select(x => x.MoneyItem))); 
      cfg.CreateMap<MoneyItemBase, MoneyItemBaseDto>() 
       .ForMember(x => x.Tags, opts => opts.MapFrom(src => src.MoneyItemTags.Select(y => y.Tag.TagName).ToList())); 
     }); 

     MoneyItemTag mo = new MoneyItemTag(); 
     mo.MoneyItem = new SingleIncome() { Id = 2, ItemText = "test", Active = false, DueDate = DateTime.Now, Amount = 33 }; 
     mo.MoneyItemId = 2; 
     var mit = new List<MoneyItemTag>() { mo }; 

     Tag tag = new Tag() { TagId = 2, TagName = "test", MoneyItemTags = mit }; 
     mo.TagId = 2; 
     mo.Tag = tag; 

     var dto = Mapper.Map<TagDto>(tag); 

     Assert.NotNull(dto); 

そして、この関係は、いくつかのトラブルを引き起こしています。私は次のテストを実行したり、私は私のAsp.Netのコアアプリケーションにマッピングを行いたい場合、私は次の例外を取得する場合:

AutoMapper.AutoMapperMappingException : Error mapping types. 

Mapping types: 
Tag -> TagDto 
HouseholdBook.Data.Model.Tag -> HouseholdBook.Dto.TagDto 

Type Map configuration: 
Tag -> TagDto 
HouseholdBook.Data.Model.Tag -> HouseholdBook.Dto.TagDto 

Property: 
MoneyItems 
---- AutoMapper.AutoMapperMappingException : Error mapping types. 

Mapping types: 
MoneyItemBase -> MoneyItemBaseDto 
HouseholdBook.Data.Model.MoneyItemBase -> HouseholdBook.Dto.MoneyItemBaseDto 

Type Map configuration: 
MoneyItemBase -> MoneyItemBaseDto 
HouseholdBook.Data.Model.MoneyItemBase -> HouseholdBook.Dto.MoneyItemBaseDto 

Property: 
Id 
-------- System.NullReferenceException : Object reference not set to an 
instance of an object. 

ここで何が悪いのでしょうか?私は例外メッセージから私が逃しているものを見ることができません。あなたはすべてのネストされたクラスのための明示的なマッピングを作成する必要があり

答えて

0

最後に私は間違っていたことを理解しました。 MoneyItemBaseは抽象クラスであり、抽象クラスは直接インスタンス化できません。

Includeメソッドを使用してクラス階層をマッピングすることになりました。CreateMapです。 以下は私の例のスニペットです。

CreateMap<MoneyItemBase, MoneyItemBaseDto>() 
     .Include<SingleIncome, SingleMoneyItemDto>() 
     .ForMember(x => x.Tags, opts => opts.MapFrom(src => src.MoneyItemTags.Select(y => y.Tag.TagName).ToList())); 

CreateMap<SingleIncome, SingleMoneyItemDto>(); 
0

cfg.CreateMap<HouseholdBook.Data.Model.Tag, HouseholdBook.Dto.TagDto>();

opts => opts.MapFrom()は、ソースとターゲットでメンバーの名前が一致しない場合、それはこれらの型の間のマップを登録しません使用されています。

関連する問題