C#Automapper 6.1.1-集合/列表目标属性丢失值实体框架6
我在使用Automapper 6映射集合时遇到问题,无法找到解决方案。在下面的C#Automapper 6.1.1-集合/列表目标属性丢失值实体框架6,c#,entity-framework,entity-framework-6,automapper,automapper-6,C#,Entity Framework,Entity Framework 6,Automapper,Automapper 6,我在使用Automapper 6映射集合时遇到问题,无法找到解决方案。在下面的updatedArticle对象中,我创建了映射后剩余的旧值和更新值,因为它们在视图模型中不存在。但是,说明中创建的和更新的的值将丢失。通过视图模型输入的值都已正确更新。我做错了什么?Automapper也会丢失文章的EntityFramework6映射,因为这些值也会丢失 控制器方法: public async Task<IHttpActionResult> UpdateArticle(ArticleVi
updatedArticle
对象中,我创建了映射后剩余的旧值和更新值,因为它们在视图模型中不存在。但是,说明中创建的和更新的的值将丢失。通过视图模型输入的值都已正确更新。我做错了什么?Automapper也会丢失文章的EntityFramework6映射,因为这些值也会丢失
控制器方法:
public async Task<IHttpActionResult> UpdateArticle(ArticleViewModel articleVm)
{
Article articleOriginal = await iArticleRepository.GetAsync(articleVm.Id);
Article updatedArticle = Mapper.Map<ArticleViewModel, Article>(articleVm, articleOriginal);
return Ok();
}
公共异步任务更新篇(ArticleViewModel articleVm)
{
Article articleOriginal=await iArticleRepository.GetAsync(articleVm.Id);
Article updatedArticle=Mapper.Map(articleVm,articleOriginal);
返回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();
Mapper.Initialize(cfg=>
{
cfg.CreateMap()
.ForMember(x=>x.Created,opt=>opt.Ignore())
.ForMember(x=>x.Updated,opt=>opt.Ignore());
cfg.CreateMap()
.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());
}
assertConfigurationsValid();
视图模型:
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; }
}
公共类ArticleViewModel
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共列表描述{get;set;}
}
公共类描述视图模型
{
公共int Id{get;set;}
公共字符串标题{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; }
}
公共类文章:IEntity
{
公共物品()
{
描述=新列表();
}
[关键]
公共int Id{get;set;}
已创建公共日期时间{get;set;}
公共日期时间已更新{get;set;}
[最大长度(256)]
公共字符串名称{get;set;}
公共虚拟ICollection描述{get;set;}
}
公共类说明:IEntity
{
[关键]
公共int Id{get;set;}
已创建公共日期时间{get;set;}
公共日期时间已更新{get;set;}
[最大长度(256)]
公共字符串标题{get;set;}
公共int ArticleId{get;set;}
公共虚拟项目{get;set;}
}
您在没有延迟加载的情况下尝试过这个吗?我自己在EF延迟加载和AutoMapper方面遇到了一些问题。首先,它效率非常低
见相关
.您在没有延迟加载的情况下尝试过这个吗?我自己在EF延迟加载和AutoMapper方面遇到了一些问题。首先,它效率非常低
见相关
.经过两天的挫折终于解决了问题。安装了AutoMapper。从
我所要做的全部更改是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();
Mapper.Initialize(cfg=>
{
cfg.AddCollectionMappers();
SetGeneratePropertyMaps();
CreateMap(MemberList.Source)
.EqualityComparison((src,dst)=>src.Id==dst.Id);
CreateMap(MemberList.Source)
.EqualityComparison((src,dst)=>src.Id==dst.Id);
}
assertConfigurationsValid();
在两天的挫折之后终于解决了这个问题。安装了AutoMapper。从
我所要做的全部更改是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();
Mapper.Initialize(cfg=>
{
cfg.AddCollectionMappers();
SetGeneratePropertyMaps();
CreateMap(MemberList.Source)
.EqualityComparison((src,dst)=>src.Id==dst.Id);
CreateMap(MemberList.Source)
.EqualityComparison((src,dst)=>src.Id==dst.Id);
}
assertConfigurationsValid();
我也面临同样的问题。我安装了这两个软件包,但使用的是AddCollectionMappers()正在引发错误。它无法识别此错误。它说“IConfiguration”不包含“AddCollectionMappers”的定义。您能帮我解决这个问题吗?哎呀……真是个愚蠢的错误。已将其安装在其他项目中。由于某些原因,当我尝试添加“AddCollectionMappers”时它无法识别。我正在使用Collection v4.0.0和Automapper v7.0.1。我确实在相应的项目中安装了它。我也面临同样的问题。我安装了这两个软件包,但使用的是AddCollectionMappers()正在引发错误。它无法识别此错误。它说“IConfiguration”不包含“AddCollectionMappers”的定义。您能帮我解决这个问题吗?哎呀……真是个愚蠢的错误。已将其安装在其他项目中。由于某些原因,当我尝试添加“AddCollectionMappers”时它不识别它。我正在使用Collection v4.0.0和Automapper v7.0.1。我确实在相应的项目中安装了它。