C# Automapper 6.1.1 - Collection/List 目标属性丢失值 Entity Framework 6
C# Automapper 6.1.1 - Collection/List destination properties loses values Entity Framework 6
我在使用 Automapper 6 映射集合时遇到问题,我找不到解决方案。在下面的 updatedArticle
对象中,我在映射后留下了旧的 Created
和 Updated
值,因为它们在视图模型中不存在。但是,描述中 Created
和 Updated
的值丢失了。通过视图模型传入的值都已正确更新。我究竟做错了什么? Automapper 也丢失了文章的 Entity Framework 6 个映射,因为这些值也丢失了。
控制器方法:
public async Task<IHttpActionResult> UpdateArticle(ArticleViewModel articleVm)
{
Article articleOriginal = await iArticleRepository.GetAsync(articleVm.Id);
Article updatedArticle = Mapper.Map<ArticleViewModel, Article>(articleVm, articleOriginal);
return Ok();
}
映射:
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();
视图模型:
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; }
}
型号:
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; }
}
你试过没有延迟加载吗?我自己在使用 EF 延迟加载和 AutoMapper 时遇到了一些问题。首先效率很低。
查看相关内容
Answer.
折腾了两天终于解决了。从 https://github.com/AutoMapper/AutoMapper.Collection
安装 AutoMapper.Collection
PM> Install-Package AutoMapper.Collection
PM> Install-Package AutoMapper.Collection.EntityFramework
我只需要更改 cfg.AddCollectionMappers();
和 EqualityComparison
。示例:
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();
我在使用 Automapper 6 映射集合时遇到问题,我找不到解决方案。在下面的 updatedArticle
对象中,我在映射后留下了旧的 Created
和 Updated
值,因为它们在视图模型中不存在。但是,描述中 Created
和 Updated
的值丢失了。通过视图模型传入的值都已正确更新。我究竟做错了什么? Automapper 也丢失了文章的 Entity Framework 6 个映射,因为这些值也丢失了。
控制器方法:
public async Task<IHttpActionResult> UpdateArticle(ArticleViewModel articleVm)
{
Article articleOriginal = await iArticleRepository.GetAsync(articleVm.Id);
Article updatedArticle = Mapper.Map<ArticleViewModel, Article>(articleVm, articleOriginal);
return Ok();
}
映射:
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();
视图模型:
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; }
}
型号:
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; }
}
你试过没有延迟加载吗?我自己在使用 EF 延迟加载和 AutoMapper 时遇到了一些问题。首先效率很低。
查看相关内容 Answer.
折腾了两天终于解决了。从 https://github.com/AutoMapper/AutoMapper.Collection
安装 AutoMapper.CollectionPM> Install-Package AutoMapper.Collection
PM> Install-Package AutoMapper.Collection.EntityFramework
我只需要更改 cfg.AddCollectionMappers();
和 EqualityComparison
。示例:
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();