五步掌握OOM框架AutoMapper基本使用
发布时间 - 2026-01-10 22:35:03 点击率:次写在前面

OOM顾名思义,Object-Object-Mapping实体间相互转换,AutoMapper也是个老生常谈了,其意义在于帮助你无需手动的转换简单而又麻烦的实体间关系,比如ViewModel和entity的转换,SearchModel和Entity的转换,我这篇分享的意义在于,网上大多数的分享都是几年前的,很多方法已经被废弃,到了编译器里会告诉你该方法已经过时,废弃的,不建议使用的,比如Mapper.CreateMap等方法,当然老司机大多数直接就去github看文档了,或者google一下就了解了,但是中文资料关于方法废弃后,并没有什么说明了。本篇的五个实例可以帮你解决常见的基本问题.
预备
首先我们预备一些ViewModel和TModel。ViewModel就是你和用户交互的实体。TModel就是你与数据库打交道的实体。
实体展示如下:
TModel有如下三个简单的实体,他们有独立的实体,也有一对多的实体。
public class TAddress
{
public string Country { get; set; }
public string City { get; set; }
public string Street { get; set; }
public string PostCode { get; set; }
public string CreateTime { get; set; }
public int CreateUserId { get; set; }
}
public class TAuthor
{
public string Name { get; set; }
public string Description { get; set; }
public List<TContactInfo> ContactInfo { get; set; }
}
public class TContactInfo
{
public int Id { get; set; }
public string Email { get; set; }
public string Blog { get; set; }
public string Twitter { get; set; }
}
ViewModel如下三个:
public class VM_Address
{
public string Country { get; set; }
public string City { get; set; }
public string City2 { get; set; }
}
public class VM_Author
{
public string Name { get; set; }
public string Description { get; set; }
public List<VM_ContactInfo> ContactInfo { get; set; }
}
public class VM_ContactInfo
{
public int Id { get; set; }
public string Email { get; set; }
public string Blog { get; set; }
public string Twitter { get; set; }
}
单个实体转换
单个实体转换的时候,在属性字段名称完全匹配的情况下,你只需指定两个实体间的转换规则,指定source源实体和destination目标实体。那么你应该参照如下实例:
VM_Address dto = new VM_Address
{
Country = "China",
City = "Beijing"
};
Mapper.Initialize(m => m.CreateMap<VM_Address, TAddress>());
TAddress address = Mapper.Map<VM_Address, TAddress>(dto);
请注意在AutoMapper5.x当中,Initialize来初始化你的规则是首选的。
在你指定转换规则后,请使用Map方法,进行转换并输出你的目标实体。还有第一个参数代表SourceModel,第二个参数是DestinationModel.
单个实体不同名属性转换
当你需要对不同名称的字段来进行映射的时候,请注意使用ForMember方法,第一个参数需要你制定所需特殊配置的目标字段,第二个参数你则需要制定你对该字段属性的操作,我选择了它提供的MapFrom方法,意义在于告诉AutoMapper,我需要讲目标实体的City来源 指定为 源实体的City2属性值。
VM_Address dto = new VM_Address
{
Country = "China",
City2 = "Beijing"
};
Mapper.Initialize(m => m.CreateMap<VM_Address, TAddress>().ForMember(x => x.City, opt => opt.MapFrom(o => o.City2)));
TAddress address = Mapper.Map<VM_Address, TAddress>(dto);
集合转换
在集合间转换的时候,你不需要配置目标List与源List对象中的匹配,而只需要配置你泛型对象的映射匹配关系。
TAddress address = new TAddress { Country = "China", City = "Beijing" };
TAddress address2 = new TAddress() { Country = "USA", City = "New York" };
List<TAddress> addressList = new List<TAddress>() { address2, address };
Mapper.Initialize(m => m.CreateMap<TAddress, VM_Address>());//这里仅需配置实体间的转换,而不是实体集合的转换
List<VM_Address> res = Mapper.Map<List<TAddress>, List<VM_Address>>(addressList);
实体包含不同类型属性转换(忽略属性)
在实体包含不同类型属性的时候,比如TModel1中包含了一个List<TModel>,而你的ViewModel1中包含了一个List<ViewModel>.这个时候你可以选择忽略这个属性
var contacts = new List<TContactInfo>() { new TContactInfo()
{ Blog = "myblog", Email = "ws@qq.com" }, new TContactInfo() { Blog = "myblog", Email = "ll@qq.com" } };
TAuthor author = new TAuthor() { Description = "描述", Name = "吴双", ContactInfo = contacts };
Mapper.Initialize(m => { m.CreateMap<TAuthor, VM_Author>().ForMember(x => x.ContactInfo, opt => opt.Ignore()); });
VM_Author dto = Mapper.Map<TAuthor, VM_Author>(author);
//这里的Ignore代表配置ContractInfo该属性的操作 为 忽略Ignore,映射时将忽略该属性 由于List<TContactInfo>()和List<VM_ContactInfo>() 是不同类型,所以需要配置忽略或者是特殊映射,特殊映射例子看下方
实体包含不同类型属性转换(指定属性Mapfrom)
当然你需要这个属性的时候,你可以不忽略他,而是使用MapFrom来进行特殊的指定,并且在类型不相同的时候,你要指定你两个类型间的映射匹配关系。正如下面实例中的
m.CreateMap<TContactInfo, VM_ContactInfo>();和
m.CreateMap<TAuthor, VM_Author>().ForMember(x => x.ContactInfo, opt => opt.MapFrom(o => o.ContactInfo));
var contacts = new List<TContactInfo>()
{
new TContactInfo() { Blog = "myblog", Email = "ws@qq.com" },
new TContactInfo() { Blog = "myblog", Email = "ll@qq.com" }
};
TAuthor author = new TAuthor() { Description = "描述", Name = "吴双", ContactInfo = contacts };
Mapper.Initialize(m =>
{
m.CreateMap<TContactInfo, VM_ContactInfo>();//注意 内部不同类型实体转换时必要的
m.CreateMap<TAuthor, VM_Author>().ForMember(x => x.ContactInfo, opt => opt.MapFrom(o => o.ContactInfo));//注意 制定MapFrom是必要的
});
VM_Author dto = Mapper.Map<TAuthor, VM_Author>(author);
写在最后
在实体转换中,AutoMapper的必要性和实用性已经被你一览无余。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# automapper
# 使用
# ASP.NET Core使用AutoMapper实现实体映射
# .NET 6开发TodoList应用之使用AutoMapper实现GET请求
# C# 中AutoMapper的使用方法
# C# AutoMapper 使用方法总结
# .NET CORE中使用AutoMapper进行对象映射的方法
# .NET Core中依赖注入AutoMapper的方法示例
# 详解c# AutoMapper 使用方式
# Automapper实现自动映射的实例代码
# AutoMapper实体映射基本用法
# 不同类型
# 你可以
# 第一个
# 第二个
# 请注意
# 都是
# 有什么
# 是个
# 也有
# 包含了
# 你要
# 老生常谈
# 当你
# 只需
# 帮你
# 所需
# 你不
# 请使用
# 或者是
# 你对
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何使用Sanctum进行API认证?(SPA实战)
个人摄影网站制作流程,摄影爱好者都去什么网站?
浅析上传头像示例及其注意事项
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
轻松掌握MySQL函数中的last_insert_id()
Android实现代码画虚线边框背景效果
如何在阿里云高效完成企业建站全流程?
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
网站建设保证美观性,需要考虑的几点问题!
Android仿QQ列表左滑删除操作
如何为不同团队 ID 动态生成多个独立按钮
js实现点击每个li节点,都弹出其文本值及修改
Laravel如何实现API资源集合?(Resource Collection教程)
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
Laravel如何使用查询构建器?(Query Builder高级用法)
javascript基于原型链的继承及call和apply函数用法分析
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
如何在Ubuntu系统下快速搭建WordPress个人网站?
如何用IIS7快速搭建并优化网站站点?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
高性价比服务器租赁——企业级配置与24小时运维服务
怎样使用JSON进行数据交换_它有什么限制
大连网站制作公司哪家好一点,大连买房网站哪个好?
Android滚轮选择时间控件使用详解
电商网站制作价格怎么算,网上拍卖流程以及规则?
Python并发异常传播_错误处理解析【教程】
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
Laravel怎么为数据库表字段添加索引以优化查询
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
装修招标网站设计制作流程,装修招标流程?
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
JS碰撞运动实现方法详解
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
历史网站制作软件,华为如何找回被删除的网站?
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
Laravel怎么上传文件_Laravel图片上传及存储配置
南京网站制作费用,南京远驱官方网站?
Python面向对象测试方法_mock解析【教程】
网站制作报价单模板图片,小松挖机官方网站报价?
上一篇:木须肉简易做法
上一篇:木须肉简易做法

