tnblog
首页
视频
资源
登录

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

4956人阅读 2022/11/5 12:12 总访问:688050 评论:0 收藏:0 手机
分类: .net core

问题描述

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

  1. public class SomeEntity
  2. {
  3. public Guid Id { get; set; }
  4. public virtual NestedObject NestedObject { get; set; }
  5. public DateTime Created { get; set; }
  6. public DateTime Modified { get; set; }
  7. }
  8. public class SomeEntityViewModel
  9. {
  10. public Guid Id { get; set; }
  11. public string NestedObjectStringValue { get; set; }
  12. public int NestedValueIntValue { get; set; }
  13. }

这是我的 CreateMap,即使没有设置 NestedObject-Property,它也会创建一个新的 NestedObject(条件似乎在这里不适用):

  1. CreateMap<SomeEntityViewModel, SomeEntity>(MemberList.Source)
  2. .ForPath(m => m.NestedObject.StringValue, opt =>
  3. {
  4. opt.Condition(s => s.Destination.NestedObject != null);
  5. opt.MapFrom(m => m.NestedObjectStringValue);
  6. });

如果属性为空,则避免创建新的 NestedObject,但如果不是,则不会映射 NestedObject 属性:

  1. CreateMap<SomeEntityViewModel, SomeEntity>(MemberList.Source)
  2. .ForMember(m => m.NestedObject, opt => opt.AllowNull());

如果设置了第二个 CreateMap,则不会映射 NestedObject-Properties,如果未设置 Properties,则首先创建一个新的 NestedObject.但两者都不起作用.任何想法如何解决这个问题?

推荐答案

移除 ReverseMap() ,然后尝试使用 AutoMapper 条件映射 并使用 ForPath 而不是 ForMember 嵌套子对象属性:

  1. CreateMap<SomeEntityViewModel, SomeEntity>()
  2. .ForPath(
  3. m => m.NestedObject.StringValue,
  4. opt => {
  5. opt.Condition(
  6. s => s.DestinationMember != null && s.DestinationMember != ""
  7. );
  8. opt.MapFrom(s => s.NestedObjectStringValue);
  9. }
  10. );

同IntValue.

更新

因此,如果 NestedObject 为空,您不想将 SomeEntityViewModel 中的值映射到它.如果 NestedObject 不为空,则映射有效.

请参考下面使用AfterMap

  1. CreateMap<SomeEntityViewModel, SomeEntity>()
  2. .ForMember(q => q.NestedObject, option => option.Ignore())
  3. .AfterMap((src, dst) => {
  4. if(dst.NestedObject != null)
  5. {
  6. dst.NestedObject.StringValue = src.NestedObjectStringValue;
  7. }
  8. });

原文:https://www.it1352.com/2598455.html


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

评价

css弹性盒子flex布局

css弹性盒子由于版本不同浏览器问题造成了一些不同的写法display:flexbox;在google浏览器中如果使用下面的写法就不行displa...

可输入下拉文本框据输入动态加载数据 jquery-editable-select

用到一个jquery-editable-select的控件github地址:https://github.com/indrimuska/jquery-editable-select这个插件的原理是...

.net mvc分部页.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

css中单位pxemrem和vh/vw的理解

&gt;px像素(Pixel)。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。em是相对长度单位。相对于当前对象内文本的字...

让IIS支持webp格式图片让IIS支持vtt格式iis设置mime类型iis配置支持的类型

webp格式图片可以让图片体积变小。也让下载图片变得更加困难一点 在线制作webp工具 https://www.upyun.com/webp?utm_mediu...

网页上传文件断点续传的实现无视文件大小上传以及datatables基本用法

首先明白js是客户带执行代码,c#是服务器上执行代码。本地文件需要用到js处理,服务器端接受c#代码处理1.HTML页面,文件信...

如何使用图标像使用文字一样使用文本图标的方法

1.首先在Iconfont-阿里巴巴矢量图标库上面找到你需要的图标然后加入你的购物车然后选择图标;注意:每个类型的图标会大小不...

使用七牛云的cdn服务提高图片的加载速度

CDN介绍CDN的全称是Content Delivery Network,即内容分发网络。CDN加速主要是加速静态资源,如网站上面上传的图片、媒体,...

通俗易懂什么是.NET?什么是.NET Framework?什么是.NET Core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

JS监听input、keydown有输入法时打字完成后触发事件

在给输入框绑定input或keydown事件时预期效果是有输入法时,输入中文后触发事件,不希望输一个字母就触发一次事件可以用到c...

修改了css后让浏览器从缓存中更新

当我们修改了css后,如果不做一些操作,浏览器是不会自动更新我们的样式文件的。除非是过期或者用户手动刷新清理缓存等。所...

C MVC RedirectToAction跳转时候传递参数Action之间传值

MVC Action之间传值,页面跳转传值方法一:路由传值很简单直接使用 RedirectToAction(string actionName, string controller...

当你工作遇到以下几种状态时请果断跳槽走人

已经有想跳槽的念头,但是一直磨磨蹭蹭、犹犹豫豫的混日子,这种念头或者一直持续,或者是不是冒出头来占据你的思维了。于...

C与Java二进制编码转换补码

在C#与Java接口对接时,需要将图片转化为二进制编码传输,这时候发现c#转换出来的编码的值是0~255的范围,而java方需要的是...
如果有缘,错过了还会重来,如果无缘,相遇了也会离开
排名
9
文章
115
粉丝
5
评论
5
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术