2017-01-26 4 views
0

Я пробовал множество примеров здесь и из вики-автомата, и я все еще не могу решить эту проблему. Я пытаюсь отобразить вложенный объект и вложенную коллекцию, и независимо от того, что я делаю, это всегда вызывает ошибку. Единственный способ заставить контроллер вернуть данные - это включить option.ignore для двух свойств.Automapper - невозможно сопоставить вложенные объекты/коллекторы

Это объекты бизнес-уровня, я пытаюсь отобразить

public class LocationBL 
{ 
    public int Id { get; set; }   
    public string Name { get; set; } 
    public string Address { get; set; } 
    public string Address2 { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string Zipcode { get; set; } 
    public string Country { get; set; } 

    public DbGeography Coordinates { get; set; } 

    public int LocationType_Id { get; set; } 

    public virtual LocationTypeBL LocationType { get; set; } 

    public virtual ICollection<SportBL> Sports { get; set; } 
} 

public class LocationTypeBL 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<LocationBL> Locations { get; set; } 
} 
public class SportBL 
{ 

    public int Id { get; set; } 

    public string Name { get; set; } 

    public virtual ICollection<LocationBL> Locations { get; set; } 

    public virtual ICollection<UserBL> Users { get; set; } 
} 

Это уровень данных объектов

public class Location : EntityData 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    [ForeignKey("Company")] 
    public int? CompanyId { get; set; } 

    [Required] 
    public string Name { get; set; } 
    public string Address { get; set; } 
    public string Address2 { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string Zipcode { get; set; } 
    public string Country { get; set; } 
    [Required] 
    public DbGeography Coordinates { get; set; } 
    [ForeignKey("LocationType")] 
    public int LocationType_Id { get; set; } 

    public virtual LocationType LocationType { get; set; } 

    public virtual ICollection<Sport> Sports { get; set; } 
    public virtual Company Company { get; set; } 
} 

public class LocationType : EntityData 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Location> Locations { get; set; } 
} 

public class Sport : EntityData 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    [Required] 
    public string Name { get; set; } 

    public virtual ICollection<Location> Locations { get; set; } 

    public virtual ICollection<User> Users { get; set; } 
} 

Это мое отображение профиля

public class LocationProfile : Profile 
{ 
    public LocationProfile() 
    { 
     CreateMap<LocationType, LocationTypeBL>(); 
     CreateMap<LocationTypeBL, LocationType>(); 
     CreateMap<Location, LocationBL>() 
      .ForMember(Dest => Dest.Sports, 
      opt => opt.MapFrom(src => src.Sports)) 
      .ForMember(Dest => Dest.LocationType, 
      opt => opt.MapFrom(src => src.LocationType)); 

     CreateMap<LocationBL, Location>() 
      .ForMember(Dest => Dest.Sports, 
      opt => opt.MapFrom(src => src.Sports)) 
      .ForMember(Dest => Dest.LocationType, 
      opt => opt.MapFrom(src => src.LocationType)); 




    } 
} 

UPDATE ** ***** Это мой LocationType profile

public class LocationTypeProfile : Profile 
{ 
    public LocationTypeProfile() 
    { 
     CreateMap<LocationType, LocationTypeBL>(); 
     CreateMap<LocationTypeBL, LocationType>(); 
    } 
} 

Это мой профиль Спорт

public class SportProfile : Profile 
{ 
    public SportProfile() 
    { 
     CreateMap<Sport, SportBL>(); 
     CreateMap<SportBL, Sport>(); 
    } 
} 

Не уверен, если это имеет значение, но это бэкенд Azure Mobile App с помощью Autofac, WebAPI и Owin. Это мой первый раз, используя AutoMapper и Autofac, поэтому, пожалуйста, простите меня, пока я все еще участвую. Все профили зарегистрированы, и если я вставляю вложенные объекты в игнор, контроллер возвращает правильные данные.

Спасибо заранее!

ответ

0

Вы почти находитесь. Вам необходимо указать AutoMapper, как отображать вложенные объекты. Поэтому вам нужно создать карту для Sport до SportBL и наоборот.

// use ForMember if needed, but you know how to do that so I won't 
// show it. 
CreateMap<Sport, SportBL>(); 

Тогда AutoMapper будет использовать это сопоставление при отображении вложенных сложных типов.

Еще одно замечание: если ваши классы имеют одинаковые свойства, вы можете просто вызвать метод ReverseMap(), и он сделает двунаправленное сопоставление для вас.

Таким образом, вместо этого:

CreateMap<LocationType, LocationTypeBL>(); 
CreateMap<LocationTypeBL, LocationType>(); 

Вы можете просто сделать это, чтобы сделать то же самое:

Mapper.CreateMap<LocationType, LocationTypeBL>().ReverseMap(); 
+0

Кроме того, изначально я попытался с помощью .ReverseMap(), и это не будет работать. –

+0

Как насчет 'User' и' UserBL', вы их сопоставили? И какое исключение вы получите. Полная трассировка стека поможет. – CodingYoshi

+0

Пользователь и UserBL отображаются. –

Смежные вопросы