Automapper выравнивается с помощью createmap - PullRequest
1 голос
/ 28 октября 2011

У меня есть несколько классов, которые мне нужно отобразить в 1 класс:

Это источник, из которого я сопоставляю (просмотр модели):

public class UserBM
{
    public int UserId { get; set; }

    public string Address { get; set; }
    public string Address2 { get; set; }
    public string Address3 { get; set; }
    public string State { get; set; }

    public int CountryId { get; set; }
    public string Country { get; set; }
}

Вот каков класс назначения (модель домена):

public abstract class User
{
    public int UserId { get; set; }

    public virtual Location Location { get; set; }
    public virtual int? LocationId { get; set; }
}

public class Location
{
    public int LocationId { get; set; }

    public string Address { get; set; }
    public string Address2 { get; set; }
    public string Address3 { get; set; }
    public string State { get; set; }

    public virtual int CountryId { get; set; }
    public virtual Country Country { get; set; }

}

Вот как выглядит моя карта создания автомашины:

Mapper.CreateMap<UserBM, User>();

На основании документов на сайте Codeplex Autopper, это должно быть автоматическим, но это не работает. Address, Address2 и т. Д. Все еще равны нулю. Как должен выглядеть мой createmap?

Ответы [ 4 ]

0 голосов
/ 08 ноября 2011

Причина в том, что AutoMapper не может сопоставить все эти плоские поля с Location объектом по соглашению.

Вам понадобится пользовательский преобразователь.* Однако , Мне не нравится .IMO, лучшим способом было бы заключить эти свойства в вашей ViewModel во вложенную модель представления:

public class UserBM
{
    public int UserId { get; set; }
    public LocationViewModel Location { get; set; }
}

Тогда все, что вам нужно сделать, это определить дополнительную карту:все это будет работать.

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

0 голосов
/ 28 октября 2011

Я думаю, вам нужно сделать имена свойств похожими на LocationAddress и LocationAddress2 на UserBM для их автоматического проецирования, но я могу ошибаться.

Проверьте их страницу на Сглаживание у них есть имена свойств, у которых есть оба имени свойств источника, объединенные, как я указал.

0 голосов
/ 29 октября 2011

Просто следуйте соглашению об именах в вашем целевом классе и добавьте к свойствам адреса префикс Location, поскольку это имя свойства в исходном классе:

public class UserBM
{
    public int UserId { get; set; }

    public string LocationAddress { get; set; }
    public string LocationAddress2 { get; set; }
    public string LocationAddress3 { get; set; }
    public string LocationState { get; set; }

    public int CountryId { get; set; }
    public string Country { get; set; }
}
0 голосов
/ 28 октября 2011

РЕДАКТИРОВАТЬ странно, этот вопрос был задан вами ... кажется, тот же вопрос - я думаю, я что-то упустил ...

Проверьте это SQ Вопрос

*

Определить два сопоставления, оба сопоставления из одного источника в разные назначения

*

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