Automapper Вопрос - PullRequest
       7

Automapper Вопрос

0 голосов
/ 17 апреля 2011

У меня есть четыре сущности Организация и адрес .. Ради краткости я опустил все, кроме рассматриваемых свойств в моих сущностях и моделях представления

public class Organization : VersionedAuditableEntityWithTypedId<Guid>, IAggregateRoot
{
    //Organization related properties are in here

    /// <summary>
    /// Organization Address
    /// </summary>
    [NotNull]
    public virtual Address Address { get; set; }
}

public class Address : AuditableEntityWithTypedId<Guid>
{
   // Address related properties are in here

    /// <summary>
    /// Region/State
    /// </summary>
    [NotNull]
    public virtual Region Region { get; set; }
}

public class Country : EntityWithTypedId<Guid>
{
    /// <summary>
    /// Name of country
    /// </summary>
    [DomainSignature, Length(Max = 50), NotNullNotEmpty, SelectListItemDisplay, SelectListItemValue]
    public virtual string Name { get; set; }
}

public class Region : EntityWithTypedId<Guid>
{
    /// <summary>
    /// Name of region
    /// </summary>
    [Length(Max = 50), NotNullNotEmpty, SelectListItemDisplay,SelectListItemValue]
    public  virtual string Name { get; set; }

    /// <summary>
    /// Country
    /// </summary>
    [NotNull]
    [SuppressMessage("Microsoft.Naming", "CA1721", Justification = "Common naming for type descriptions")]
    public virtual Country Country { get; set; }
}

У меня есть две модели представления

  1. EditOrganizationViewModel
  2. EditAddressViewModel

В моей EditOrganizationViewModel у меня есть следующее свойство

public class EditOrganizationViewModel
{

 /// <summary>
 /// Organization address
 /// </summary>
 public EditAddressViewModel Address { get; set; }

}

Мой EditAddressViewModel имеет список стран

public class EditAddressViewModel

{

/// <summary>
/// List of countries
/// </summary>
public IEnumerable<SelectListItem> Countries { get; set; }

}

Свойство моих стран не сопоставляется ни с чем в моем объекте адреса, но необходимо для отображения списка стран, и оно отображается в моем слое обслуживания.

Я выполняю сопоставление один раз в своем приложении, как показано ниже ...

Один раз для EditAddressViewModel ...

Mapper.CreateMap<Address, EditAddressViewModel>()
.ForMember(dest => dest.LabelForAddress1, opt => opt.Ignore())
.ForMember(dest => dest.LabelForAddress2, opt => opt.Ignore())
.ForMember(dest => dest.LabelForAddress3, opt => opt.Ignore())
.ForMember(dest => dest.LabelForAddressType, opt => opt.Ignore())
.ForMember(dest => dest.LabelForCity, opt => opt.Ignore())
.ForMember(dest => dest.LabelForCountry, opt => opt.Ignore())
.ForMember(dest => dest.LabelForPostcode, opt => opt.Ignore())
.ForMember(dest => dest.LabelForRegion, opt => opt.Ignore())
.ForMember(dest => dest.Types, opt => opt.Ignore())
.ForMember(dest => dest.Countries, opt => opt.Ignore())
.ForMember(dest => dest.Regions, opt => opt.Ignore())
.ForMember(dest => dest.Country, opt => opt.MapFrom(src => src.Region.Country.Id))
.ForMember(dest => dest.Region, opt => opt.MapFrom(src => src.Region.Id))
.ForMember(dest => dest.Type, opt => opt.MapFrom(src => src.Type.Id))
Mapper.CreateMap<EditAddressViewModel, Address>();

и один раз для EditOrganizationViewModel ..

Mapper.CreateMap<Organization, EditOrganizationViewModel>()
.ForMember(dest => dest.LabelForOrganizationName, opt => opt.Ignore())
.ForMember(dest => dest.LabelForTeamSport, opt => opt.Ignore())
.AfterMap(
(organization, viewModel) =>
MapListItemToViewModel(organization.Phones, viewModel.Phone,
p => p.Type.Name == Resources.BusinessPhone))
.AfterMap(
(organization, viewModel) =>
MapListItemToViewModel(organization.Phones, viewModel.Fax,
p => p.Type.Name == Resources.FaxPhone)) 
.AfterMap(
(organization, viewModel) =>
MapListItemToViewModel(organization.EmailAddresses, viewModel.EmailAddress,
p => p.Type.Name == Resources.PrimaryEmailAddress));

Я строю свою модель представления, как показано ниже

public EditOrganizationViewModel CreateOrganizationFormViewModel()
{
        // Create the organization view model
        var viewModel = new EditOrganizationViewModel();

        // Load the organization and bind to view model
        var organization = _organizationRepository.FindAll().FirstOrDefault();

        if (organization == null) organization = new Organization();

         // Business Address
        viewModel.Address =
            AddressManagementService.Instance.CreateEditAddressViewModel(Resources.BusinessAddress);

   **At this point my countries list is populated**

   // Map the organization to the view model
      Mapper.Map(organization, viewModel);

  **My countries property is now null after Mapper.Map is called**
}

Проблема возникает, когда я вызываю Mapper.Map (organization, viewModel).Список стран теперь нулевой.Я не уверен, как настроить мои конфигурации отображения, чтобы сохранить мой список стран.Я пытался использовать значение Resolver, но он вызывается только если адрес организации не является нулевым.Я бы не хотел, чтобы мне пришлось сглаживать мою модель организации и включать информацию об адресе.Любая помощь будет принята с благодарностью.

если или

1 Ответ

1 голос
/ 18 апреля 2011

любая из двух вещей должна работать ...

  1. для этого поля в отображении вместо Ignore() try UseDestinationValue()
  2. заполнить список стран после выполнения карты (обратный порядок последних двух строк вашей функции)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...