Сопоставление одного (класса сущности) со многими (dto's / viewModels) - PullRequest
0 голосов
/ 10 апреля 2011

Я пытаюсь сопоставить информацию о пользователе с несколькими dto, но я получаю нулевые исключения. По сути, причина, по которой я распространил информацию по нескольким классам, заключается в том, что в нескольких представлениях мне нужна общая информация. Вот что я закончил:

Класс сущности пользователя

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

CTO для DTO и ViewModel

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

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

Вызов autopper внутри UserController

    public ActionResult Summary()
    {

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

Я думал, потому что у меня есть все необходимые отображения внутри загрузчика, это должно, теоретически работает, по-видимому, я ошибался ... Как я могу это исправить?

UPDATE:

Я исправил сопоставления и добавил пару преобразователей значений. Теперь я не получаю исключение нулевой ссылки, но, похоже, что-то не так, потому что каждый раз, когда я запускаю проект, он зависает, а затем локальный сервер перестает отвечать ... Вот мой код:

        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 Ответ

1 голос
/ 10 апреля 2011

Без дополнительной информации о полученном вами исключении я могу только догадываться, что может пойти не так: я думаю это потому, что вы используете Linq для неинициализированных коллекций в MapFrom.Попробуйте вместо этого реализовать ValueResolver.

...