Ho un problema durante la mappatura delle collezioni con Automapper 6 e non riesco a trovare una soluzione. Nell'oggetto updatedArticle
qui sotto ho i vecchi valori Created
e Updated
lasciati dopo la mappatura poiché non esistono sul modello di vista. Tuttavia, i valori per Created
e Updated
in Descriptions sono persi. I valori che arrivano tramite il modello di visualizzazione sono tutti aggiornati correttamente. Che cosa sto facendo di sbagliato? Automapper perde anche il mapping di Entity Framework 6 per l'articolo poiché anche questi valori vengono persi.
Metodo di controllo:
public async Task<IHttpActionResult> UpdateArticle(ArticleViewModel articleVm)
{
Article articleOriginal = await iArticleRepository.GetAsync(articleVm.Id);
Article updatedArticle = Mapper.Map<ArticleViewModel, Article>(articleVm, articleOriginal);
return Ok();
}
Mappatura:
Mapper.Initialize(cfg =>
{
cfg.CreateMap<ArticleViewModel, Article>()
.ForMember(x => x.Created, opt => opt.Ignore())
.ForMember(x => x.Updated, opt => opt.Ignore());
cfg.CreateMap<DescriptionViewModel, Description>()
.ForMember(x => x.Created, opt => opt.Ignore())
.ForMember(x => x.Updated, opt => opt.Ignore())
.ForMember(x => x.ArticleId, opt => opt.Ignore())
.ForMember(x => x.Article, opt => opt.Ignore());
}
Mapper.AssertConfigurationIsValid();
ViewModels:
public class ArticleViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public List<DescriptionViewModel> Descriptions { get; set; }
}
public class DescriptionViewModel
{
public int Id { get; set; }
public string Heading { get; set; }
}
Modelli:
public class Article : IEntity<int>
{
public Article()
{
Descriptions = new List<Description>();
}
[Key]
public int Id { get; set; }
public DateTime Created { get; set; }
public DateTime Updated { get; set; }
[MaxLength(256)]
public string Name { get; set; }
public virtual ICollection<Description> Descriptions { get; set; }
}
public class Description: IEntity<int>
{
[Key]
public int Id { get; set; }
public DateTime Created { get; set; }
public DateTime Updated { get; set; }
[MaxLength(256)]
public string Heading { get; set; }
public int ArticleId { get; set; }
public virtual Article Article { get; set; }
}
Finalmente risolto dopo due giorni di frustrazione. Installato AutoMapper.Collection da https://github.com/AutoMapper/AutoMapper.Collection
PM> Install-Package AutoMapper.Collection
PM> Install-Package AutoMapper.Collection.EntityFramework
Tutto quello che dovevo cambiare era cfg.AddCollectionMappers();
e EqualityComparison
. Esempio:
Mapper.Initialize(cfg =>
{
cfg.AddCollectionMappers();
cfg.SetGeneratePropertyMaps<GenerateEntityFrameworkPrimaryKeyPropertyMaps<DbContext>>();
cfg.CreateMap<ArticleViewModel, Article>(MemberList.Source)
.EqualityComparison((src, dst) => src.Id == dst.Id);
cfg.CreateMap<DescriptionViewModel, Description>(MemberList.Source)
.EqualityComparison((src, dst) => src.Id == dst.Id);
}
Mapper.AssertConfigurationIsValid();