2010-04-26 3 views
5

Первый раз, используя AutoMapper, и мне сложно определить, как его использовать. Я пытаюсь сопоставить ViewModel с моими таблицами базы данных.Как использовать AutoMapper?

Мои ViewModel выглядит так ...

public class AddressEditViewModel 
{ 
    public AddressEdit GetOneAddressByDistrictGuid { get; private set; } 
    public IEnumerable<ZipCodeFind> GetZipCodes { get; private set; } 

    public AddressEditViewModel(AddressEdit editAddress, IEnumerable<ZipCodeFind> Zips) 
    { 
     this.GetOneAddressByDistrictGuid = editAddress; 
     this.GetZipCodes = Zips; 
    } 
} 

по картированию Я пытаюсь использовать это ...

CreateMap<Address, AddressEditViewModel>(); 

Когда я запускаю этот тест ...

public void Should_map_dtos() 
{ 
    AutoMapperConfiguration.Configure(); 
    Mapper.AssertConfigurationIsValid(); 
} 

Я получаю эту ошибку ...

AutoMapper.AutoMapperConfigurationException: Следующее 2 свойства на JCIMS_MVC2.DomainModel.ViewModels.AddressEditViewModel не отображается: GetOneAddressByDistrictGuid GetZipCodes Добавить выражение пользовательского отображения, игнорировать, или переименовать свойство на JCIMS_MVC2.DomainModel.Address.

Я не уверен, как я должен отображать эти 2 свойства. Буду признателен за любое направление. Благодаря

Марк

+0

Просьба указать язык программирования. – doublep

+0

Пара вещей. Во-первых, AutoMapper ожидает no-arg ctors в типе назначения. Далее, можете ли вы опубликовать какой адрес? –

+0

Обратитесь к автогенерированному LINQ to SQL классу, созданному, когда я отбросил таблицу в дизайнере ... Это довольно большой класс ... сколько он хочет увидеть? -MARK- –

ответ

6

Ok, так что я могу видеть несколько вещей, которые вы делаете, что, вероятно, не поможет.

Во-первых, этот AutoMapper используется для копирования свойств в одном объекте в Свойства в объекте diff. По пути он может допросить или манипулировать ими, чтобы получить viewmodel конечного результата в правильном состоянии.

  1. Свойства называются «Get ...», что для меня больше похоже на метод.
  2. Конфигураторы по вашим свойствам являются частными, поэтому AutoSetter их не сможет найти. Измените их на минимальные внутренние.
  3. Использование параметризованного конструктора больше не требуется, когда вы используете AutoMapper - при прямом преобразовании с одного объекта на другой. Параметрированный конструктор в основном показывает, что явно требуется этому объекту.

    CreateMap<Address, AddressEditViewModel>() 
         .ForMember(x => x.GetOneAddressByDistrictGuid , 
              o => o.MapFrom(m => m."GetOneAddressByDistrictGuid")) 
         .ForMember(x => x.GetZipCodes, 
              o => o.MapFrom(m => m."GetZipCodes")); 
    

Что Automapper действительно хорошо копирует из DataObjects в объекты POCO или объектов View Model.

public class AddressViewModel 
    { 
       public string FullAddress{get;set;} 
    } 

    public class Address 
    { 
       public string Street{get;set;} 
       public string Suburb{get;set;}   
       public string City{get;set;} 
    } 

    CreateMap<Address, AddressViewModel>() 
      .ForMember(x => x.FullAddress, 
           o => o.MapFrom(m => String.Format("{0},{1},{2}"), m.Street, m.Suburb, m.City )); 

    Address address = new Address(){ 
     Street = "My Street"; 
     Suburb= "My Suburb"; 
     City= "My City"; 
    }; 

    AddressViewModel addressViewModel = Mapper.Map(address, Address, AddressViewModel); 
Смежные вопросы