我正在尝试设置AutoMapper以将实体转换为DTO。我知道我应该在.ForMember()
之后使用Mapper.CreateMap<Entity, DTO>()
来设置自定义映射,但这似乎不是一种可用的方法。
编辑以澄清: 我不是要查找我已阅读的文档的链接,或者是基本语法的解释。我正在使用答案和文档中描述的正确语法,例如:
Mapper.CreateMap<EFAddress, Address>()
.ForMember(dest => dest.Code, opt => opt.MapFrom(src => src.Name));
如果我在CreateMap中有一个无效的类型名称&lt;&gt;我可以看到“ForMember”作为一种有效的方法,鼠标悬停显示方法签名,正如我通常所期望的那样。但只要我给它两个有效类型,ForMember说它无法解析符号,就好像方法不可用一样。
对于我没有遇到的泛型类,是否存在某种约束?
由于
答案 0 :(得分:110)
请尝试以下语法:
Mapper
.CreateMap<Entity, EntityDto>()
.ForMember(
dest => dest.SomeDestinationProperty,
opt => opt.MapFrom(src => src.SomeSourceProperty)
);
或者如果源和目标属性具有相同的名称:
Mapper.CreateMap<Entity, EntityDto>();
请查看documentation的相关部分,了解更多详情和其他地图方案。
答案 1 :(得分:15)
最后,我认为这与ReSharper有些不相容。
ReSharper似乎导致Automapper代码显示不正确,但工作正常(即使它显示带有错误消息的红色)。卸载ReSharper完全解决了这个问题。
答案 2 :(得分:7)
示例实现如下:
Mapper.CreateMap<Game, GameViewModel>()
.ForMember(m => m.GameType, opt => opt.MapFrom(src => src.Type))
我们需要映射这个属性,因为Game和GameViewModel的属性名称是不同的 - 如果它们相同且类型相同则不需要ForMember
ForMember的另一个用途是忽略映射
Mapper.CreateMap<Game, GameViewModel>()
.ForMember(dest => dest.Prize, opt => opt.Ignore());
答案 3 :(得分:0)
此用法以及
CreateMap<Azmoon, AzmoonViewModel>()
.ForMember(d => d.CreatorUserName, m => m.MapFrom(s =>
s.CreatedBy.UserName))
.ForMember(d => d.LastModifierUserName, m => m.MapFrom(s =>
s.ModifiedBy.UserName)).IgnoreAllNonExisting();
答案 4 :(得分:-7)
你这样做吗
Mapper.CreateMap<SourceType,DestinationType>().ForMember(What ever mapping in here)
This page有一些很好的例子