AutoMapper - 如何映射到三级深度

时间:2015-09-22 18:39:23

标签: c# asp.net-mvc entity-framework-6 automapper

我尝试使用AutoMapper来压缩与另一个实体相关的实体,该实体与第三个实体有关,以查看模型

如何将这三个实体映射成一个?

来源:

public class Address
{
    public int AddressId { get; set; }
    public string AddressLine1 { get; set; }       
    public int CityId { get; set; }
    public virtual City City { get; set; }  
}

public class City
{
    public int CityId { get; set; }
    public string CityName { get; set; }
    public int CountryId { get; set; }
    public virtual Country Country { get; set; }

    public virtual ICollection<Address> Addresses { get; set; }
}
public class Country
{
    public int CountryId { get; set; }
    public string CountryName { get; set; }
    public virtual ICollection<City> Cities { get; set; }
}

目的地:

Public Class AddressViewModel
{
    public int AddressId { get; set; }
    public string AddressLine1 { get; set; }       
    public int CityId { get; set; }
    public string CityName { get; set; }
    public int CountryId { get; set; }
    public string CountryName { get; set}
}

2 个答案:

答案 0 :(得分:1)

有两种方式(至少)。如果以不同的方式命名viewmodel字段,则可以按惯例进行:

Public Class AddressViewModel
{
    public int AddressId { get; set; }
    public string AddressLine1 { get; set; }       
    public int CityCityId { get; set; }
    [DisplayName("City Name")]
    public string CityCityName { get; set; }
    public int CityCountryCountryId { get; set; }
    [DisplayName("Country Name")]
    public string CityCountryCountryName { get; set}
}

如果这太丑了,你可以在CreateMap中执行:

Mapper.CreateMap<Address, AddressViewModel>()
    .ForMember(dest => dest.CityId, opts => opts.MapFrom(src => src.City.CityId))
    .ForMember(dest => dest.CityName, opts => opts.MapFrom(src => src.City.CityName))
    .ForMember(dest => dest.CountryId, opts => opts.MapFrom(src => src.City.Country.CountryId))
    .ForMember(dest => dest.CountryName, opts => opts.MapFrom(src => src.City.Country.CountryName));

http://automapper.codeplex.com/wikipage?title=Flattening&referringTitle=Home

答案 1 :(得分:0)

使用Include()查询更深层数据的示例:

    public AddressViewModel GetAddressById(int id)
    {
        var result = applicationDbContext.Address
            .Include(o=>o.City)
            .Include(o=>o.City.Country)
            .FirstOrDefault(x=>x.AddressId == id);
        return mapper.Map<AddressViewModel>(result);
    }