应无所住,而生其心
排名
12
文章
74
粉丝
4
评论
15
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

AutoMapper 配置忽略,配置对象可以为空。AutoMapper对象如果不为空则映射。解决AutoMapper自动创建对象。AutoMapper自动new ef的导航属性对象。AutoMapper中写为空判断。基础的单项映射,双向映射

5800人阅读 2022/5/23 17:19 总访问:5186149 评论:0 收藏:0 手机
分类: .NET Core

基础的单向配置与双向配置

单向配置

  1. // 单项映射
  2. CreateMap<Menu,MenuMetaDto>();

双向配置

  1. // 双向映射
  2. CreateMap<MenuDto, Menu>().ReverseMap();

AutoMapper 配置忽略 (找不到映射的时候会报错)

有些时候如果对象字段多了没有找到映射的对象就会报错,所以需要配置成忽略的

  1. //忽略属性
  2. CreateMap<EmployeeArchivesDto, EmployeeArchives>()
  3. .ForMember(dest => dest.UserInfo, opt => opt.Ignore())
  4. .ForMember(dest => dest.ArchivesType, opt => opt.Ignore());

AutoMapper 配置对象可以为空

  1. CreateMap<EmployeeArchivesDto, EmployeeArchives>()
  2. .ForMember(dest => dest.UserInfo, opt => opt.AllowNull())
  3. .ForMember(dest => dest.ArchivesType, opt => opt.AllowNull());

如果字段名字不一样,可以这样配置映射关系,指定字段映射

  1. CreateMap<JToken, SchedulHeadViewModel>()
  2. .ForMember(dest => dest.HospitalId,
  3. options => options.MapFrom(c => c.SelectToken("Hospital_ID")))
  4. .ForMember(dest => dest.BranchId,
  5. options => options.MapFrom(c => c.SelectToken("Branch_ID")))
  6. .ForMember(dest => dest.SchedulId,
  7. options => options.MapFrom(c => c.SelectToken("ScheduHeadID")));

现在比较新版一点的换成下面这种写法了:

  1. CreateMap<Menu, MenuMetaDto>()
  2. .ForMember(dest => dest.RolesTemp, opt => opt.MapFrom(src => src.Roles));

忽略字段和指定字段映射配合起来用

  1. // 单向映射,并且指定了字段映射的
  2. CreateMap<Menu, MenuMetaDto>()
  3. // 忽略字段,找不到映射的时候会报错
  4. .ForMember(dest => dest.Roles, opt => opt.Ignore())
  5. .ForMember(dest => dest.RolesTemp, opt => opt.MapFrom(src => src.Roles));

如果想要取子对象数据的映射可以这样配置

  1. CreateMap<EmployeeArchives, EmployeeArchivesDto>()
  2. .ForMember(dest => dest.UserName, opt => opt.MapFrom(src => src.UserInfo.UserName))
  3. .ForMember(dest => dest.ArchivesTypeName, opt => opt.MapFrom(src => src.ArchivesType.archives_type_name))
  4. .ReverseMap();

但是这里要注意的,就是这里使用了ReverseMap,是双向映射,这里边使用了导航属性的赋值,src.ArchivesType.xxx和src.UserInfo.xx,这种虽然查询的时候没有问题,但是如果是添加的时候,也就是从EmployeeArchivesDto映射到EmployeeArchives的时候会自动new对象就会有问题,就会自动去添加外键了。

解决方法就是两个映射单独配置,就不会相互影响了,复杂情况下双向很容易出错

dto到ef实体的映射也就是EmployeeArchivesDto到EmployeeArchives的映射就直接配置一个简单的映射就行,不会设置到子对象的赋值

  1. CreateMap<EmployeeArchivesDto, EmployeeArchives>();

然后ef实体到dto的映射,就涉及到子对象的取值赋值了,注意这里就不需要调用ReverseMap()

  1. CreateMap<EmployeeArchives, EmployeeArchivesDto>()
  2. .ForMember(dest => dest.UserName, opt => opt.MapFrom(src => src.UserInfo.UserName))
  3. .ForMember(dest => dest.ArchivesTypeName, opt => opt.MapFrom(src => src.ArchivesType.archives_type_name));

还有一种解决方法就是写成双向,然后加一点判断

  1. CreateMap<EmployeeArchivesDto, EmployeeArchives>();
  2. CreateMap<EmployeeArchives, EmployeeArchivesDto>()
  3. .AfterMap((src, dst) =>
  4. {
  5. if (src.UserInfo != null)
  6. {
  7. dst.UserName = src.UserInfo.UserName;
  8. }
  9. if (src.ArchivesType != null)
  10. {
  11. dst.ArchivesTypeName = src.ArchivesType.archives_type_name;
  12. }
  13. });

两种方法大家都可以根据不同情况去尝试一下!


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

映射AutoMapper

前言 DTO与AutoMapperDTODTO是个什么东东?DTO(Data Transfer Object)就是数据传输对象,说白了就是一个对象,只不过里边...

.NET CORE 中使用AutoMapper进行对象映射

AutoMapper基于约定的对象-对象映射器。AutoMapper使用流畅的配置API定义对象-对象映射策略。AutoMapper使用基于约定的匹配...

AutoMapper映射自定义类型

AutoMapper映射自定义类型[TOC]枚举 public class UserState : Enumeration { public static readonly UserState ...

ABP 自动映射 AutoMapper

转载:https://www.cnblogs.com/sugarwxx/p/13298800.html自动映射有如下几种:AutoMap,AutoMapFrom和AutoMapTo1.AutoMap...

AutoMapper在C中的有趣应用

最近发现了一个比较有趣的东西 AutoMapper,主要将Model转换为DTO,DTO更注重数据,对领域对象进行合理封装,从而不会将领...

AutoMapper配置映射关系AutoMapper 配置子对象的情况配置对象里边还有对象的情况

如果字段名字不一样,可以这样配置映射关系 CreateMap&lt;LandInfo, LandInfoDto&gt;().ForMember(dest =&gt; dest._remar...

如果对象为空如何将 AutoMapper 9 配置为忽略对象属性但如果不为空则映射

问题描述我尝试了很多,但找不到我真正要找的东西.这是我的情况:我有一个带有导航属性和视图模型的 EF-Core 实体: public ...

net 项目中使用AutoMapper

目录 net 项目中使用automapper 自动注入方式 项目中引入包 注入服务 写automapper 配置文件 具体使用automapper...

Quartz.NET实例动态改变周期调度misfire、Cron

Quartz:Java编写的开源的任务调度作业框架 类似Timer之类定时执行的功能,但是更强大Quartz.NET:是把Quartz转成C# NuGet...

.NET Windows服务发布、安装、卸载、监听脚本服务调试

一、脚本 为方便不用每次都去写安装卸载的脚本1.安装脚本@echooff @echo开始安装【服务】 %SystemRoot%\Microsoft.NET\Fr...

nginx常用命令nginx启动命令nginx重启命令nginx关闭命令nginx测试配置文件是否正确nginx nginx.pid文件丢失报错

启动命令:start nginx 关闭命令:nginx -s stop nginx -s quit nginx -s stop与nginx -s quit区别 Quit is a graceful shu...

DevExpress.XtraSpreadsheet.SpreadsheetControl控件 加载excel模板

stringpath=&quot;文件路径&quot;; DevExpress.XtraSpreadsheet.SpreadsheetControlspreadsheetControl=newDevExpress.Xtr...

上传文件到服务器及 下载到 客户端

usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingSystem.Net; usingSystem.IO; namespaceCo...

使用OutLook发送邮件

publicstaticvoidOutlook(stringSubject,stringTextBody,stringFromAdd,stringFromPass,stringTo,stringCC,List&lt;string&...

类型“DbSet”在未引用的程序集中定义必须添加对程序集“EntityFramework Version=5.0.0.0 Culture=neutral PublicKeyToken=b7

在用mvc+ef的时候在DAL层引用上下文信息的时候会报出下面错误其实就是没得EntityFromwork,打开vs项目,点击工具,选择NuGe...