I am trying to introduce Automapper into an application for the first time, but I keep getting an error saying I have some invalid arguments.
My 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; } } }
My View 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; } } } }
Created mappings:
CreateMap<Store, StoreVM>(); CreateMap<StoreVM, Store>();
Within my controller, I am trying to map a selection of stores to storeVM. I am currently getting my stores as so;
var stores = db.Store.Include(s => s.StoreGrade); stores = from s in db.Store.Where(s => s.Active.Equals(true)) select s;
I am wanting to map the selection of stores to StoreVM, I have tried the following, but i get an invalid parameters warning,
var VMstores = Mapper.Map<Store, StoreVM>(stores);
I am receiving the error that the best overloaded method match has some invalid arguments.
Can anyone point me in the right direction?
A Map is an object that maps keys to values. A map cannot contain duplicate keys: Each key can map to at most one value. It models the mathematical function abstraction.
Map is a collection of key-value pairs where the key can be of any type. Map remembers the original order in which the elements were added to it, which means data can be retrieved in the same order it was inserted in.
Because a Map is not a true collection, its characteristics and behaviors are different than the other collections like List or Set. A Map cannot contain duplicate keys and each key can map to at most one value.
An object map is a test asset that contains items that associate a logical name (an alias) with a control or a window, rather than the control or window's locator. Once a control is registered in an object map asset, all references to it in scripts are made by its alias, rather than by its actual locator name.
You are mapping collections, not single entities (IEnumerable<Store>
to IEnumerable<StoreVM>
), so use this mapping
var VMstores = Mapper.Map<IEnumerable<Store>, IEnumerable<StoreVM>>(stores);
Update! Now you can do this:
var VMstores = stores.Project().To<StoreVM>();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With