Преобразовать строковое значение в сущность в Automapper - PullRequest
0 голосов
/ 07 февраля 2011

Я пытаюсь выяснить, как использовать Automapper, когда у моей сущности есть поле типа сущности.
У меня есть 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, входящий в контакт. Можно ли определить правило, чтобы Automapper знал, как преобразовать строку (компанию) в код объекта моей компании, члена Contact?

1 Ответ

2 голосов
/ 08 февраля 2011

Вам нужно использовать 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))
...