2012-12-03 12 views
36

Próbuję wprowadzić Automappera do aplikacji po raz pierwszy, ale ciągle dostaję błąd z informacją, że mam pewne nieprawidłowe argumenty.Kolekcja map obiektów

Mój model:

namespace StoreGradesLib.Models 
{ 
    public class Store 
    { 
     [Key] 
     public int StoreID { get; set; } 

     [Required] 
     [MaxLength(120)] 
     public string StoreName { get; set; } 

     [Required] 
     [MaxLength(20)] 
     public string StoreNumber { get; set; } 

     [Required] 
     [MaxLength(120)] 
     public string ManagerName { get; set; } 

     [Required] 
     public long PhoneNumber { get; set; } 

     [Required] 
     public string AddressLine1 { get; set; } 

     public string AddressLine2 { get; set; } 

     [Required] 
     public string Postcode { get; set; } 

     [Required] 
     public int WallArea { get; set; } 

     [Required] 
     public int FloorArea { get; set; } 

     [Required] 
     public int NumWindows { get; set; } 

     [Required] 
     public int NumDesks { get; set; } 

     [Required] 
     public int NumDoors { get; set; } 

     [Required] 
     public int StoreGradeID { get; set; } 

     [Required] 
     public bool Active { get; set; } 

     public virtual StoreGrade StoreGrade { get; set; } 

     [Timestamp] 
     public Byte[] Timestamp { get; set; } 
    } 
} 

moim zdaniem Model:

namespace StoreGradesLib.ViewModels 
{ 
    public class StoreVM 
    { 
     public int StoreID { get; set; } 
     public bool Active { get; set; } 
     public Byte[] Timestamp { get; set; } 

     [Required(ErrorMessage = "Store Name is required.")] 
     [Display(Name = "Store Name")] 
     public string StoreName { get; set; } 

     [Required(ErrorMessage = "Store Number is required")] 
     public string StoreNumber { get; set; } 

     [Required(ErrorMessage = "Store Manager is required.")] 
     [Display(Name = "Manager Name")] 
     public string ManagerName { get; set; } 

     [Required(ErrorMessage = "Contact Number is required.")] 
     [Display(Name = "Phone Number")] 
     public int PhoneNumber { get; set; } 

     [Required(ErrorMessage = "Address Line 1 is required.")] 
     [Display(Name = "Address Line 1")] 
     public string AddressLine1 { get; set; } 

     [Display(Name = "Address Line 2")] 
     public string AddressLine2 { get; set; } 

     [Required(ErrorMessage = "Postcode is required.")] 
     public string Postcode { get; set; } 

     [Required(ErrorMessage = "Must input wall area.")] 
     [Display(Name = "Wall Area")] 
     public int WallArea { get; set; } 

     [Required(ErrorMessage = "Must input floor area.")] 
     [Display(Name = "Floor Area")] 
     public int FloorArea { get; set; } 

     [Required(ErrorMessage = "Must input number of windows.")] 
     [Display(Name = "Windows")] 
     public int NumWindows { get; set; } 

     [Required(ErrorMessage = "Must input number of desks.")] 
     [Display(Name = "Desks")] 
     public int NumDesks { get; set; } 

     [Required(ErrorMessage = "Must input number of doors.")] 
     [Display(Name = "Doors")] 
     public int NumDoors { get; set; } 

     [Required(ErrorMessage = "Store must have a grade.")] 
     public StoreGrade StoreGradeID { get; set; } 

     public string Address 
     { 
      get 
      { 
       return StoreName + " " + AddressLine1 + " " + AddressLine2 + " " +     Postcode; 
      } 
     } 
    } 
} 

Utworzony mapowania:

CreateMap<Store, StoreVM>(); 
CreateMap<StoreVM, Store>(); 

ciągu mojego kontrolera, próbuję mapować wybór sklepów do storeVM . W tej chwili kupuję moje sklepy;

var stores = db.Store.Include(s => s.StoreGrade); 
stores = from s in db.Store.Where(s => s.Active.Equals(true)) 
       select s; 

Ja chce odwzorować wybór sklepów do StoreVM próbowałem następujące, ale pojawia się Nieprawidłowe parametry ostrzeżenia

var VMstores = Mapper.Map<Store, StoreVM>(stores); 

Otrzymuję błąd, że najlepszym przeciążona metoda mecz ma pewne nieprawidłowe argumenty.

Czy ktoś może wskazać mi właściwy kierunek?

Odpowiedz

90

Ty mapujesz zbiory, a nie pojedyncze jednostki (IEnumerable<Store> do IEnumerable<StoreVM>), a więc korzystać z tego odwzorowania

var VMstores = Mapper.Map<IEnumerable<Store>, IEnumerable<StoreVM>>(stores); 
+3

Ah wow dzięki! Próbowałem to głosować, ale to mi nie pozwala. Kiedy używam stackoverflow więcej, będę pamiętać, aby wrócić i zagłosować! Przez ostatnie pół godziny podsłuchiwałeś mnie, dziękuję bardzo! – EverythingGeek

+2

@ user1873098 welcome :) Miałem te same problemy, kiedy zacząłem używać automappera –

+1

AUTOMAPPER HIZZAA !!! – hanzolo

10

Update! Now you can do this:

var VMstores = stores.Project().To<StoreVM>(); 
+0

: w przyszłości będą one nazywane [Rozszerzalne rozszerzenia] (https://github.com/AutoMapper/AutoMapper/wiki/Queryable-Extensions) i będą uwzględnione w automapper. –