2011-04-17 82 views
0

我有四個實體組織和地址..for簡便起見,我在實體省略了所有的問題,但性能和的ViewModelsAutomapper問題

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

在我的埃德itOrganizationViewModel我有以下特性

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)時出現問題。國家名單現在是空的。我不知道如何設置我的映射配置來保存我的列表。我曾嘗試使用valueresolver,但只有組織的地址不爲null時纔會調用它。我討厭不得不真的壓扁我的組織視圖模型幷包含地址信息。任何幫助將不勝感激。

如果還是

回答

1

任兩件事情應該工作...

  1. 在映射這一領域,而不是Ignore()嘗試UseDestinationValue()
  2. 填充國名單中的地圖後(顛倒你函數最後2行的順序)
+0

UseDestinationValue()完美地工作!我還添加了此映射 .ForMember(dest => dest.Address,opt => opt.Condition(src => src.Address!= null)) .ForMember(dest => dest.Address,opt => opt .MapFrom(src => src.Address)) Thx! – user351479 2011-04-19 05:28:43