ho le seguenti entità Entity Framework:risparmio automapper mappato Collezioni di entità utilizzando Entity Framework
public class Region
{
public int RegionId { get; set; } // Primary Key
public string Name { get; set; }
public virtual ICollection<Country> Countries { get; set; } // Link Table
}
public class Country
{
public int CountryId { get; set; } // Primary Key
public string Name { get; set; }
public int RegionId { get; set; } // Foreign Key
}
traccio questi utilizzando automapper alle seguenti ViewModels:
public class RegionViewModel
{
public int RegionId { get; set; }
public string Name { get; set; }
public virtual ICollection<int> Countries { get; set; }
}
public class CountryViewModel
{
public int CountryId { get; set; }
public string Name { get; set; }
}
voglio tradurre le mie ViewModels alle entità che utilizzano AutoMapper in modo da poter salvare una nuova regione. Questo è il mio codice di mappatura:
Mapper.CreateMap<RegionViewModel, Region>()
.ForMember(x => x.Countries, x => x.MapFrom(y => y.Countries.Select(z => new Country() { CountryId = z }).ToArray()));
Questo fa sì un'eccezione quando si aggiunge la regione nel repository come si cerca anche di creare una nuova istanza di paese con un nome nullo. Una soluzione è cambiare il metodo Add
nel mio repository per impostare lo stato degli oggetti Paese su Invariato.
public async Task Add(Region region)
{
foreach (Country country in region.Countries)
{
this.Context.Entry(country).State = EntityState.Unchanged;
}
await base.Add(region);
}
L'altra soluzione alternativa è quella di usare la logica traduzione più complessa che utilizza un altro repository per ottenere gli oggetti paese reale. Questo approccio ha prestazioni più lente perché deve effettuare una chiamata extra al database, ma si ottiene anche un oggetto Region più completo.
Mapper.CreateMap<RegionViewModel, Region>();
Mapper.CreateMap<int[], Country[]>().ConvertUsing(x => countryRepository.GetAll().Result.Where(y => x.Contains(y.CountryId)).ToArray());
Mi chino al primo ma qual è l'approccio corretto?
Perché è necessario utilizzare l'automapper? Potresti usare l'entità come viewmodel? – stepandohnal
Uso AutoMapper per risparmiare tempo durante la scrittura del codice di traduzione di boilerplate. Ogni se rimuovi AutoMapper dalla domanda. Penso che la domanda sia ancora valida. Qual è l'approccio corretto. –