Преобразование строкового значения в сущность в Automapper

Я пытаюсь понять, как использовать Automapper, когда моя сущность имеет поле типа entity.
У меня есть 3 таких класса:

public abstract class Entity<IdK> 
{
    public virtual IdK Code { get; protected set; }
}

public class Contact : Entity
{
    public virtual string Name { get; set; }
    public virtual Company Company { get; set; }
}

public class Company : Entity
{
    public virtual string Name { get; set; }
}

Мой класс Contact содержит элемент типа Company.
Я также создал ViewModel для передачи некоторой информации в мое представление:

public ContactViewModel()
{
        public Guid Code { get; set; }
        public int Version { get; set; }

        [DisplayName("Contact")]
        public string Name { get; set; }

        [DisplayName("Company")]
        public string Company { get; set; }
}

В моей модели представления я определил поле Company типа string. Он будет содержать значение, которое пользователь выберет из раскрывающегося списка (список компаний).

Я определил загрузчик при запуске моего приложения:

public class AutoMapperConfiguration
    {
        public static void Configure()
        {
            Mapper.Initialize(x => {
                x.CreateMap<Domain.Contact, ViewModels.ContactViewModel>();
                x.CreateMap<ViewModels.ContactViewModel, Domain.Contact>()
            });
        }
    }

Когда я пытаюсь переназначить ViewModel на свой объект, я получаю сообщение об ошибке преобразования (AutoMapper.AutoMapperMappingException). Automapper не может понять, как преобразовать мою компанию (строку) в объект типа Company, члена Contact. Можно ли определить правило, чтобы Automapper знал, как преобразовать строку (компанию) в код моего объекта Company, члена Contact?


person LeftyX    schedule 07.02.2011    source источник


Ответы (1)


Вам нужно использовать Resolver. Что-то типа:

public class CompanyTypeResolver : ValueResolver<string, Company>
{
    protected override Company ResolveCore(string name)
    {
        return new Company {Name = name};
    }
}

Затем в коде сопоставления вы называете это так:

.ForMember(dto => dto.Company, opt => opt.ResolveUsing<CompanyTypeResolver>().FromMember(src => src.Name))
person ozczecho    schedule 07.02.2011
comment
Это то, что я искал. Спасибо. - person LeftyX; 08.02.2011