2011-09-28 10 views
10

Hola a todos/muy nuevo en Auto-Mapper. puedo mapear objetos uno a uno pero me preguntaba si es posible mapear múltiples objetos a un objeto o múltiples objetos a múltiples objetos?cómo asignar OBJETOS múltiples a un objeto usando AutoMapper - asp.net mvc 3

considerar tengo un siguiente escenario ...

Modelo de Usuario

public class User 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public Company Company { get; set; } // 1 user work in 1 company 
    } 

Empresa Modelo

public class Company 
     { 
      public string CompanyName { get; set; } 
      public string Website { get; set; } 
      public ICollection<User> Users { get; set; } // 1 Company can have many users 
     } 

UserCompanyViewModel

quiero mostrar la lista de usuarios con su empresa detalles en una vista ...

public class UserCompanyViewModel 
      { 
       public ICollection<User> Users { get; set; } 
       ppublic ICollection<Company> Companies { get; set; } 
      } 

Ahora, es posible hacer un mapa en esta situación y si es así, puedo mostrar en una vista y al editar esa vista quiero volver a mapear con los campos actualizados a sus respectivos Modelos.

cualquier ayuda se agradece ... THX

Respuesta

13

En este caso, es lo que realmente está usando el múltiple (tipos de) los objetos como su fuente? Según su problema definido, su fuente es una lista de usuarios, a juzgar por "quiero mostrar la lista de usuarios con los detalles de su empresa".

Si ese es el caso, mientras que no se puede hacer de manera implícita se puede utilizar un TypeConverter para realizar el mapa con bastante facilidad:

Mapper.CreateMap<ICollection<User>, UserCompanyViewModel>() 
     .ConvertUsing<UserCompanyViewModelConverter>(); 

A continuación, defina su convertidor como:

public class UserCompanyViewModelConverter : ITypeConverter<ICollection<User>, UserCompanyViewModel> 
{ 
    public UserCompanyViewModel Convert(ResolutionContext context) 
    { 
     UserCompanyViewModel model = new UserCompanyViewModel(); 

     ICollection<User> sourceUsers = (ICollection<User>)context.SourceValue; 

     model.Users  = sourceUsers; 
     model.Companies = sourceUsers.Select(u => u.Company).Distinct().ToList(); 

     return model; 
    } 
} 

Entonces cuando desee asignar un mapa, simplemente tome su colección de usuarios someUsers y asóciela:

UserCompanyViewModel model = Mapper.Map<ICollection<User>, UserCompanyViewModel>(someUsers); 

Si realmente necesita asignar múltiples tipos de fuente en un solo tipo de destino, parece que this blog post incluye una clase corta de ayuda que lo ayudará. En resumen, AutoMapper no es compatible con esto, por lo que realizarás un par de solicitudes de mapas para llenar tu ViewModel. Tendrá que utilizar otro TypeConverter para asegurarse de que la segunda llamada no reemplace a las compañías agregadas por el primero.

+0

como he dicho, en una vista quiero mostrar una colección de usuarios con los detalles de la empresa. entonces habrá 2 colecciones de usuarios, compañías, entonces tengo UserCompanyViewModel para mostrar eso. –

+0

Sin embargo, ViewModel es el destino. Su colección de origen, los datos que está recuperando de su tienda para luego ponerlos en ViewModel, ¿verdad? – Kasaku

+0

sí correcto ... en este caso, mis fuentes son una colección de Usuarios y Collcetion of Companies. Quiero poner todo junto en UserCompanyVM de destino y luego mostrar al usuario foreach con los detalles de la compañía. –

Cuestiones relacionadas