Как сопоставить несколько ОБЪЕКТОВ с одним объектом с помощью AutoMapper - asp.net mvc 3

Привет всем/очень новый для 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; }   
            }

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

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

Ответ 1

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

Если это так, в то время как вы не можете сделать это неявно, вы можете использовать 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 не совсем поддерживает это, поэтому вы будете делать пару запросов на карту, чтобы заполнить ViewModel. Вам нужно будет использовать другой TypeConverter, чтобы убедиться, что второй вызов не заменяет Компании, добавленные первым.