开发者

Mapping one (entity class) to many (dto's/viewModels)

I am trying to map information about the User to several dto's, but I'm getting null exceptions. Basically, the reason why I distributed the information among several classes is because there are common info that I need in several views. So this is what I ended up with:

User entity class

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's and ViewModel calsses

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; }
}

Mappings inside AutoMapperBootStrapper class

Mapper.CreateMap<User, BiddingAndItems>()
                .ForMember(m => m.TotalBids, o => o.MapFrom(s => s.TotalActiveBids()))
                .ForMember(m=>m.ItemsAwait开发者_StackOverflowingConfirmation, 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>();

Call to automapper inside UserController

    public ActionResult Summary()
    {

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

I thought because I have all the necessary mappings inside the bootstrapper this should, theoretically work, apparently I was wrong... How can I fix that?

UPDATE:

I got my mappings fixed and added a couple of value resolvers. Now I'm not getting a null reference exception but there seems to be something wrong because everytime I run the project it gets stuck and then the local server stops responding... Here's my code:

        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();
    }
}

The problem is that I'm not getting any exceptions to give me any hints about what's going wrong... It just gets stuck! I suspect that my mappings are going into some sort of an infinite loops or something, but I am not sure what is happening exactly... Is there any way I could debug this problem?

Any help would be appreciated...


Without more information about the exception you receive I can only guess what could go wrong: I guess it's because you're using Linq on uninitialized collections in MapFrom. Try implementing a ValueResolver instead.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜