0

사용자에 대한 정보를 여러 dto에 매핑하려고하지만 null 예외가 발생합니다. 기본적으로 여러 클래스에 정보를 배포 한 이유는 여러 가지보기에서 필요한 공통 정보가 있기 때문입니다. 그래서 내가 함께 결국 무엇을 :many (dto/viewModels)에 하나의 엔티티 클래스 매핑

사용자 개체 클래스는

public class User 
{ 
    public int Id { get; set; } 
    public string Nickname { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 
    public string Password { get; set; } 
    public float Credits { get; set; } 
    public float PromotionalCredits { get; set; } 
    public string Telephone { get; set; } 
    public string Mobile { get; set; } 
    public double RatingAverage { get; set; } 
    public string ProfileImage { get; set; } 
    public virtual ICollection<Address> Addresses { get; set; } 
    public virtual ICollection<Role> Roles { get; set; } 
    public virtual ICollection<Comment> Comments { get; set; } 
    public virtual ICollection<Item> Items { get; set; } 
    public virtual ICollection<Bid> Bids { get; set; } 
    public virtual ICollection<CreditCard> CreditCard { get; set; } 
    public virtual ICollection<Message> ReceivedMessages { get; set; } 
    public virtual ICollection<Message> SentMessages { get; set; } 
    public virtual ICollection<Item> WatchList { get; set; } 
    public virtual ICollection<Rating> OwnRatings { get; set; } 
    public virtual ICollection<Rating> RatingsForOthers { get; set; } 
} 

DTO의와 뷰 모델이

public class UserInfoSummaryViewModel 
{ 
    public int Id { get; set; } 
    public string FullName { get; set; } 
    public UserDetailedStatus DetailedStatus { get; set; } 
} 

public class UserDetailedStatus 
{ 
    public float TotalCredits { get; set; } 
    public float Credits { get; set; } 
    public float PromotionalCredits { get; set; } 
    public BiddingAndItems BiddingAndItems { get; set; } 
    public int OngoingListings { get; set; } 
    public int NewMessages { get; set; } 
    public float Rating { get; set; } 
    public int NumberOfRatings { get; set; } 
} 

public class BiddingAndItems 
{ 
    public int TotalBids { get; set; } 
    public int WinningBids { get; set; } 
    public int AcquiredItems { get; set; } 
    public int ItemsAwaitingConfirmation { get; set; } 
    public List<ItemForUserBids> Items { get; set; } 
} 

매핑 AutoMapperBootStrapper 클래스 내부 calsses

Mapper.CreateMap<User, BiddingAndItems>() 
       .ForMember(m => m.TotalBids, o => o.MapFrom(s => s.TotalActiveBids())) 
       .ForMember(m=>m.ItemsAwaitingConfirmation, o=>o.MapFrom(s=>s.Items.Count(i=>i.IsAwaitingReceptionConfirmation().Equals(true)))) 
       .ForMember(m=>m.AcquiredItems, o=>o.MapFrom(s=>s.AquiredItems().Count)) 
       .ForMember(m => m.WinningBids, 
          o => o.MapFrom(s => s.Bids.Where(c => c.Item.CurrentHighestBidderId().Equals(s.Id)))); 

      Mapper.CreateMap<User, UserDetailedStatus>() 
       .ForMember(m => m.NumberOfRatings, o => o.MapFrom(s => s.OwnRatings.Count())) 
       .ForMember(m => m.NewMessages, o => o.MapFrom(s => s.TotalUnreadMessages())) 
       .ForMember(m => m.OngoingListings, o => o.MapFrom(s => s.Items.Where(i => i.IsPublished()))) 
       .ForMember(m => m.Rating, o => o.MapFrom(s => s.RatingAverage)) 
       .ForMember(m => m.TotalCredits, o => o.MapFrom(s => s.TotalCredits())); 

      Mapper.CreateMap<User, UserInfoSummaryViewModel>(); 
,536 내가 이론적으로 일, 분명히 내가 잘못했다 ... 내가 그걸 어떻게 부트 스트 래퍼 내부에 필요한 모든 매핑을 해결할 수 있어야이 때문에 내가 생각

public ActionResult Summary() 
    { 

     var user = _helper.GetUserFromSession(); 
     var viewModel = Mapper.Map<User, UserInfoSummaryViewModel>(user); 
     return View(viewModel); 
    } 

UserController 내부

전화은 automapper 하는가?

업데이트 :

내 매핑은 고정 값 리졸버의 몇 가지 추가되었다.

 Mapper.CreateMap<User, BiddingAndItems>() 
      .ForMember(m => m.TotalBids, o => o.MapFrom(s => s.TotalActiveBids())) 
      .ForMember(m => m.ItemsAwaitingConfirmation, 
         o => o.MapFrom(s => s.Items.Count(i => i.IsAwaitingReceptionConfirmation().Equals(true)))) 
      .ForMember(m => m.AcquiredItems, o => o.MapFrom(s => s.AquiredItems().Count)) 
      .ForMember(m => m.WinningBids, o => o.ResolveUsing<WinningBidsResolver>()) 
      .ForMember(m => m.Items, o => o.ResolveUsing<BiddingItemResolver>()); 

     Mapper.CreateMap<User, UserDetailedStatus>() 
      .ForMember(m => m.NumberOfRatings, o => o.MapFrom(s => s.OwnRatings.Count())) 
      .ForMember(m => m.NewMessages, o => o.MapFrom(s => s.TotalUnreadMessages())) 
      .ForMember(m => m.OngoingListings, o => o.MapFrom(s => s.Items.Where(i => i.IsPublished()).Count())) 
      .ForMember(m => m.Rating, o => o.MapFrom(s => s.RatingAverage)) 
      .ForMember(m=>m.BiddingAndItems, o => o.MapFrom(s=> s)) 
      .ForMember(m => m.TotalCredits, o => o.MapFrom(s => s.TotalCredits())); 

     Mapper.CreateMap<User, UserInfoSummaryViewModel>() 
      .ForMember(m => m.DetailedStatus, o => o.MapFrom(s => s)); 

public class BiddingItemResolver : ValueResolver<User, List<ItemForUserBids>> 
{ 
    protected override List<ItemForUserBids> ResolveCore(User source) 
    { 
     var items = new List<ItemForUserBids>(); 
     foreach (var bid in source.Bids) 
     { 
      var item = bid.Item; 
      var c = new ItemForUserBids 
         { 
          BidValue = bid.Amount, 
          Description = item.Description, 
          Id = item.Id, 
          ItemThumb = item.MainImageLink(), 
          Status = source.ItemBiddingStatus(item.Id), 
          TimeLeft = TimeUtility.TimeLeft(item.EndDate), 
          Title = item.Title 
         }; 
      items.Add(c); 
     } 
     return items; 
    } 
} 

public class WinningBidsResolver : ValueResolver<User, int> 
{ 
    protected override int ResolveCore(User source) 
    { 
     return source.Bids.Where(c => c.Item.CurrentHighestBidderId().Equals(source.Id)).Count(); 
    } 
} 

문제는 다음과 같습니다 지금은 널 참조 예외를 받고 있지만 프로젝트를 실행할 때마다이 걸리면 다음 로컬 서버가 응답을 중지하기 때문에 뭔가 잘못이있을 것 아니에요 ... 여기 내 코드입니다 내가 틀린 일에 대한 어떤 힌트도 줄 수있는 예외는 없다는 걸 알았어. 그냥 막혔어! 내 매핑이 무한 루프 또는 무언가의 일종으로 가고 있다고 의심하지만, 정확히 무슨 일이 일어나고 있는지 모르겠습니다 ...이 문제를 디버그 할 수있는 방법이 있습니까? 당신은 내가 단지 잘못 될 수있는 것을 추측 할 수받을 예외에 대한 자세한 내용은없이

어떤 도움을 주시면 감사하겠습니다 ...

답변

1

: 나는 당신이 MapFrom에서 초기화되지 않은 콜렉션에 Linq에를 사용하고 있기 때문에 그것의 추측 . 대신 ValueResolver을 구현해보십시오.

+0

내 게시물을 업데이트했습니다. 확인해주세요. 더 자세한 정보가 필요하면 알려주세요. 고맙습니다. – Kassem

+0

컴파일 코드 예제/재생산 (예 : 콘솔 응용 프로그램)을 제공해주십시오. 위의 코드를 새 프로젝트에 붙여 넣으려고했지만 컴파일되지 않았습니다. –

+0

웹 응용 프로그램이 응답하지 않으면 무한 루프를 작성 했습니까? 웹 응용 프로그램이 없거나 단위 테스트 시나리오에서 분리 된 상황에서 매핑을 시도 했습니까? –

관련 문제