代码之家  ›  专栏  ›  技术社区  ›  Ogglas

C#Automapper 6.1.1-集合/列表目标属性丢失值实体框架6

  •  0
  • Ogglas  · 技术社区  · 7 年前

    updatedArticle 下面的物体我有旧的 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; }
    }
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Ogglas    7 年前

    经过两天的挫折终于解决了。已安装AutoMapper。收集自 https://github.com/AutoMapper/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();
    
        2
  •  0
  •   miszczak    7 年前

    参见相关 Answer .