2017-04-26 15 views
1

ここに私の設定は、それらがエラーと説明になった後です。インタフェースとネストされたコレクションを持つAutoMapper EF

インタフェース:

public interface IUser 
{ 
    int Id { get; set; } 
    string Firstname { get; set; } 
    string Lastname { get; set; } 
    string Email { get; set; } 
    string Fullname { get; } 
} 

public interface IPost 
{ 
    int Id { get; set; } 

    String Description { get; set; } 

    DateTime CreatedDate { get; set; } 

    int? UserId { get; set; } 

    IUser User { get; set; } 

    ICollection<IComment> Comments { get; set; } 
} 

public interface IComment 
{ 
    int Id { get; set; } 
    string Description { get; set; } 
    DateTime CreatedDate { get; set; } 
    int? PostId { get; set; } 
    int? UserId { get; set; } 
    IUser User { get; set; } 
} 

AutoMapperの設定:

 Mapper.Initialize(cfg => cfg.CreateMap<IUser, DAL.User>()); 
     Mapper.Initialize(cfg => cfg.CreateMap<IComment, DAL.Comment>()); 
     Mapper.Initialize(cfg => cfg.CreateMap<IPost, DAL.Post>() 
      .ForMember(d => d.User, m => m.MapFrom(s => s.User)) 
      .ForMember(d => d.UserId, m => m.MapFrom(s => s.User.Id)) 
      .ForMember(d => d.Comments, m => m.MapFrom(s => s.Comments)) 
     ); 

     Mapper.AssertConfigurationIsValid(); 

EFコード:

public IEnumerable<IPost> GetPosts() 
    { 
     IQueryable<DAL.Post> query = dbSet.Posts.Include("Comments"); 
     var result = Mapper.Map<IEnumerable<IPost>>(query); 
     return result; 
    } 

エラー:

{ "HiThere.DAL.User上の次のプロパティをマッピングすることができません:\ N \ TUSER \ NADDカスタムマッピング式、無視する、カスタムリゾルバを追加する、または宛先タイプHiThere.DALを変更します。 。ユーザー\ nContextます:\ n \ tMappingスローされたHiThere.DAL.User \タイプのnException 'AutoMapper.AutoMapperConfigurationException' にHiThere.Model.Common.IUserからプロパティユーザーに "}

説明:。

私は、ASP.NET WebAPI2プロジェクト内でAutoMapperを使用して、DALとモデル間のデータをマップしています。何らかの理由で、ネストされたオブジェクトを使用するときに適切なマッピングを行うことができません。 助けていただければ幸いです。

+1

すべての 'cfg.CreateMap'が単一の' Mapper.Initialize'の中にあるべきではありませんか? 'DAL'クラスからインターフェースまでのマップもありません。 'DAL'クラスがこれらのインターフェースを実際に実装している場合、なぜAutoMapperが必要なのでしょうか? –

+0

tkanksがcfg.CreateMapを動かすo単一のMapper.Initializerが問題を修正する!!! –

答えて

1

実際、すべてのcfg.CreateMapを1つのMapper.Inizializeに追加することで修正しました。私の間違い。うまくいけば、誰かがこの便利な発見でしょう。

 Mapper.Initialize(cfg => 
      { 
       cfg.CreateMap<DAL.Post, IPost>() 
        .ForMember(d => d.User, m => m.MapFrom(s => s.User)) 
        .ForMember(d => d.UserId, m => m.MapFrom(s => s.User.Id)) 
        .ForMember(d => d.Comments, m => m.MapFrom(s => s.Comments)) 
       ; 
       cfg.CreateMap<IUser, DAL.User>().ReverseMap(); 
       cfg.CreateMap<IComment, DAL.Comment>().ReverseMap(); 
      } 
     ); 

     Mapper.AssertConfigurationIsValid(); 
関連する問題