Как отобразить несколько объектов на один объект с помощью AutoMapper - asp.net mvc 3 - PullRequest
10 голосов
/ 28 сентября 2011

Привет всем / очень плохо знаком с Auto-Mapper.я могу сопоставить один объект одному, но мне было интересно, можно ли сопоставить несколько объектов одному объекту или несколько объектов нескольким объектам?

считают, что у меня есть следующий сценарий ...

Модель пользователя

public class User
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public Company Company { get; set; }  // 1 user work in 1 company
    }

Модель компании

public class Company
        {
            public string CompanyName { get; set; }
            public string Website { get; set; }
            public ICollection<User> Users { get; set; }  // 1 Company can have many users
        }

UserCompanyViewModel

Я хочу показать список пользователей с подробностями их компании в одном представлении ..

public class UserCompanyViewModel
            {
                 public ICollection<User> Users { get; set; }
                 ppublic ICollection<Company> Companies { get; set; }   
            }

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

любая помощь будет оценена ... thx

1 Ответ

13 голосов
/ 28 сентября 2011

В этом случае вы действительно используете несколько (типов) объектов в качестве источника?Из вашей заданной проблемы похоже, что ваш источник - это список пользователей - судя по «я хочу показать список пользователей с данными их компаний».

Если это так, то вы не можете этого сделатьнеявно вы можете использовать TypeConverter для достаточно простого выполнения карты:

Mapper.CreateMap<ICollection<User>, UserCompanyViewModel>()
      .ConvertUsing<UserCompanyViewModelConverter>();

Затем определите свой конвертер как:

public class UserCompanyViewModelConverter : ITypeConverter<ICollection<User>, UserCompanyViewModel>
{
    public UserCompanyViewModel Convert(ResolutionContext context)
    {
        UserCompanyViewModel model = new UserCompanyViewModel();

        ICollection<User> sourceUsers = (ICollection<User>)context.SourceValue;

        model.Users     = sourceUsers;
        model.Companies = sourceUsers.Select(u => u.Company).Distinct().ToList();

        return model;
    }
}

Затем, когда вы хотите отобразить карту, вы просто берете свою коллекциюпользователей someUsers и сопоставьте его:

UserCompanyViewModel model = Mapper.Map<ICollection<User>, UserCompanyViewModel>(someUsers);

Если вам действительно нужно сопоставить несколько типов источников в один тип назначения, похоже, что это сообщение в блоге содержит короткий помощниккласс, который поможет вам.Короче говоря, AutoMapper не совсем поддерживает это, поэтому вы будете делать пару запросов Map, чтобы заполнить вашу ViewModel.Вам нужно будет использовать другой TypeConverter, чтобы убедиться, что второй вызов не заменит компании, добавленные первым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...