自动映射器合并对象问题

2024-03-17

让自动映射器工作后(上一个问题 https://stackoverflow.com/questions/36602430/automapper-complex-types-mapping-exception),我正在解决另一个问题(把它带到另一个问题,所以第一个问题不会太复杂)......

我还有下一堂课:

public class Model1
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime BirthDay { get; set; }
    public int Gender { get; set; }
    public string NickName { get; set; }
}    
public class Model2
{
    public bool Married { get; set; }    
    public int Children { get; set; }
    public bool HasPet { get; set; }
}

public class Entity1
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime BirthDay { get; set; }
    public int Gender { get; set; }
}    
public class Entity2
{
    public bool Married { get; set; }    
    public int Children { get; set; }
    public bool HasPet { get; set; }
    public string NickName { get; set; }
}

除了名称和复杂性之外,这些对象与我的原始对象大致相似。

和 AutoMapper 配置类(从 Global.asax 调用):

public class AutoMapperConfig
{
    public static MapperConfiguration MapperConfiguration { get; set; }

    public static void Configure()
    {
        MapperConfiguration = new MapperConfiguration(cfg => {
            cfg.AddProfile<Out>();
            cfg.CreateMap<SuperModel, SuperEntity>();
        });
        MapperConfiguration.AssertConfigurationIsValid();
    }
}

public class Out: Profile
{
   protected override void Configure()
    {
        CreateMap<Model1, Entity1>();
        CreateMap<Model2, Entity2>()
            .ForMember(dest => dest.NickName, opt => opt.Ignore());
        CreateMap<Model1, Entity2>()
            .ForMember(dest => dest.Married, opt => opt.Ignore())
            .ForMember(dest => dest.Children, opt => opt.Ignore())
            .ForMember(dest => dest.HasPet, opt => opt.Ignore());
        CreateMap<SuperModel, SuperEntity>()
            .ForMember(dest => dest.Entity1, opt => opt.MapFrom(src => src.Model1))
            .ForMember(dest => dest.Entity2, opt => opt.MapFrom(src => src.Model2));
    }
}

当我需要转换对象时,我下一步要做(此时我有_superModel初始化并填充数据):

SuperEntity _superEntity = new SuperEntity();
AutoMapperConfig.MapperConfiguration.CreateMapper().Map<SuperModel, SuperEntity>(_superModel, _superEntity);

所以,我映射Model1 to Entity1(女巫很好),还有Model2 to Entity2(witch 也很好,除了 Id 属性,该属性被忽略)。

主要对象SuperModel and SuperEntity也被映射了,并且似乎工作得很好。

当我映射时出现问题Model1 to Entity2,得到NickName(认为​​其余属性被忽略)。总是如此null!

有任何想法吗?


问题是您想要映射目标属性(Entity2)来自多个源属性值(Children, Married and HasPet from Model2 and Nickname from Model1).

您可以使用以下方法解决您的情况自定义解析器 https://github.com/AutoMapper/AutoMapper/wiki/Custom-value-resolvers或与AfterMap https://github.com/AutoMapper/AutoMapper/wiki/Before-and-after-map-actions方法。

使用自定义解析器:

您必须创建一个继承自的类ValueResolver定义您将如何绘制地图Entity2从一个SuperModel:

public class CustomResolver : ValueResolver<SuperModel, Entity2>
{
    protected override Entity2 ResolveCore(SuperModel source)
    {
        return new Entity2
        {
            Children = source.Model2.Children,
            HasPet = source.Model2.HasPet,
            Married = source.Model2.Married,
            NickName = source.Model1.NickName
        };
    }
}

然后,像这样使用它:

CreateMap<SuperModel, SuperEntity>()
    .ForMember(dest => dest.Entity1, opt => opt.MapFrom(src => src.Model1))
    .ForMember(dest => dest.Entity2, opt => opt.ResolveUsing<CustomResolver>());

使用 AfterMap:

您可以在映射后执行操作,因此传递值Model1.Nickname to Entity2.Nickname地图之后:

CreateMap<SuperModel, SuperEntity>()
    .ForMember(dest => dest.Entity1, opt => opt.MapFrom(src => src.Model1))
    .ForMember(dest => dest.Entity2, opt => opt.MapFrom(src => src.Model2))
            .AfterMap((m, e) => e.Entity2.NickName = m.Model1.NickName);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动映射器合并对象问题 的相关文章

  • 从 unsigned char* 到 char* 的转换无效

    这是一个代码 1 int main int argc char argv 2 3 signed char S psc 4 unsigned char U pusc 5 char C pc 6 7 C S 8 C U 9 10 pc psc
  • 如何在 Asp.Net Core 6 中向类型化 HttpClient 添加承载令牌身份验证

    我正在尝试使用 ASP Net Core 6 设置一个 Web api 以便用户可以到达我的端点 然后我使用特权帐户在幕后的 D365 中执行一些工作 我正在使用类型化的 HTTP 客户端 但我不确定如何插入承载身份验证 以便来自该客户端的
  • C# 中输入按键

    我尝试了这段代码 private void textBox1 KeyPress object sender KeyPressEventArgs e if Convert ToInt32 e KeyChar 13 MessageBox Sho
  • 这种对有效类型规则的使用是否严格遵守?

    C99和C11中的有效类型规则规定 没有声明类型的存储可以用任何类型写入 并且存储非字符类型的值将相应地设置存储的有效类型 抛开 INT MAX 可能小于 123456789 的事实不谈 以下代码对有效类型规则的使用是否严格符合 inclu
  • 如何将 mat 转换为 array2d

    我为dlib http dlib net face landmark detection ex cpp html那里的面部地标代码使用 array2d 来获取图像 但我喜欢使用 Mat 读取图像并转换为 array2d 因为 dlib 仅支
  • 如何使用 libclang 判断成员函数是 const 还是 volatile?

    我有一个实例CXCursor同类CXCursor CXXMethod 我想知道这个函数是否是const or volatile 例如 class Foo public void bar const void baz volatile voi
  • 使用正则表达式解析日志文件

    我目前正在为我们的内部日志文件 由 log4php log4net 和 log4j 生成 开发一个解析器 到目前为止 我有一个很好的正则表达式来解析日志 除了一个烦人的一点 一些日志消息跨越多行 我无法正确匹配 我现在的正则表达式是这样的
  • 作为服务运行时未找到 PowerShell 模块

    我有一个项目 我将 Office 365 许可证分配给用户 有一个 Web 项目允许管理员查看可用许可证并为用户选择许可证 在后台 有一项服务每 15 分钟执行一次实际的许可证分配 以及许多其他任务 我们不直接分配许可证的原因是用户可能尚未
  • 我们什么时候应该在.NET中使用NativeMemory.Alloc()? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 NET6 C 引入NativeMemory类 但我不知道什么时候应该使用NativeMemory Alloc 而不是普通的数组实例化
  • 公共基类打破了元组的空基类优化

    gcc 4 7 1 对元组进行空基类优化 我认为这是一个非常有用的功能 然而 这似乎有一个意想不到的限制 include
  • 如何使用 Selenium Webdriver .NET 绑定设置 Chrome 首选项?

    这是我正在使用的 用户代理可以成功设置 而下载首选项则不能 Windows 7 Chrome 26 Selenium dotnet 2 31 2 chromedriver win 26 0 1383 0 ChromeOptions chro
  • 我如何模拟 UserManager 和 RoleManager 进行单元测试

    我模拟了抽象类来测试类的具体方法 如下所示 var mock new Mock
  • 代码块 - 使用大地址感知标志进行编译

    如何使用以下命令在 64 位系统上编译 32 位应用程序LARGE ADRESS AWARE使用代码块标记 我需要使用超过 2GB 的内存 应该是添加的情况 Wl large address aware到链接标志 我不使用 CodeBloc
  • 指向 VLA 的指针

    你可能知道 VLA 的优点和缺点 https stackoverflow com a 3082302 1606345在 C11 中它们是可选的 我认为使 VLA 成为可选的主要原因是 堆栈可能会爆炸 int arr n where n 10
  • Bazel:将编译标志添加到默认 C++ 工具链

    我想向默认的 C 工具链添加一些编译器和链接器标志 以便我构建的所有目标 本地或导入 共享它们 我知道可以定义我自己的工具链 但我不想这样做 因为它非常复杂且容易出错 理想情况下我想要这样的东西 cc toolchain cc defaul
  • C++ 更改屏幕方向问题 -- DEVMODE dmDisplayOrientation DMDO_90 undefined

    我似乎无法编译一些 C 代码 我正在翻转显示器的方向 但 VS2008 告诉我 DMDO 90 和 DMDO 270 无法识别 error C2065 DMDO 90 undeclared identifier error C2065 DM
  • 使用 C# 的异步 WebRequest

    您好 我有一个函数 它将 url Get 参数传递到网络服务器上的 php 文件 并等待文件的响应 通常需要 10 20 秒 我想将其放入一个循环中 因为我必须一次将这些 Get 请求发送到大约 5 个不同的 php 文件 但是当我尝试将其
  • OpenSSL:无需 SSL_read() / SSL_write() 即可执行加密/解密

    我已经用 C 语言编写了一个基于事件的网络库 现在我想通过 OpenSSL 添加 SSL TLS 支持 而不是使用SSL read and SSL write 我宁愿让 OpenSSL 只执行传出 传入数据的加密 解密 让我自己传输 接收数
  • SQL Server CE 不兼容的数据库版本

    我有一个 SQL Server CE 4 0 数据库 sdf文件 当我尝试从我的应用程序 WPF 对数据库进行查询时 出现以下错误 数据库版本不兼容 如果这是兼容文件 请运行修复 其他情况请参考文档 数据库版本 4000000 请求的版本
  • 如何在c#中获取斐波那契数

    伙计们 我有一个关于斐波那契的问题 如何获得斐波那契数列 该数字也将以用户输入结束 例如 如果我输入 21 则输出必须为 0 1 1 2 3 5 8 13 21 这是我的代码 static void Main string args int

随机推荐

  • 确定 django 中的属性是否为“DeferredAttribute”

    上下文 我在 Django Cache Machine 中发现了一个相当严重的错误 导致其失效逻辑在从 Django 1 4 升级到 1 7 后失去理智 该错误仅限于调用only 在扩展缓存机器的模型上CachingMixin 它会导致深度
  • 如何剪切csv的列

    我有一组 csv 文件 大约 250 个 每个文件有 300 到 500 条记录 我需要从每个文件中剪切 2 或 3 列并将其存储到另一个文件中 我在用着操作系统 有什么办法可以在命令或实用程序中做到这一点吗 如果您知道字段内没有出现列分隔
  • 使用 1xx 响应通过 HTTP 报告进度

    问题 通过 HTTP 提供进度信息 我正在编写一个应用程序 我想为长时间运行的请求提供进度信息 我希望客户端能够报告进度 例如完成百分比 并向用户发送消息 HTTP 1xx 响应 我的目的是在最终 HTTP 响应之前使用 HTTP 1xx
  • 如何在 Gnome 终端中对 Python 错误的输出进行着色?

    注意 我在研究如何实际做到这一点后提出这个问题 其他有点相似但实际上与我的问题不同的问题涉及 颜色编码withinpython脚本 导入颜色库within剧本 使用类似的工具Solarized改进工具 例如Vim对 python 代码进行颜
  • Python unittest:如何临时将标准输出消息重定向到缓冲区并测试其内容?

    我想捕获发送到的消息stdout our stderr 在测试期间暂时断言这些消息中是否出现某些字符串模式 import unittest class SomeTest unittest TestCase def test stdout s
  • Tomcat 6 堆大小 - 这是正确的吗?

    我在 Red Hat 机器上运行多个 tomcat 我想为每个 tomcat 配置单独的堆大小 某些实例使用更多内存 我可以在 catalina sh 文件中输入以下内容来设置堆大小最小 最大 bt CATALINA OPTS Xms64m
  • WPF 将控件可见性绑定到另一个控件的聚焦属性

    我有一个显示项目列表的组合框 我想在它旁边放置一个按钮来触发命令以查看所选项目的详细信息 到目前为止 一切都很好 现在我希望该按钮仅在组合框具有焦点时才可见 或处于 编辑 模式 但不仅在弹出窗口打开时 我想我可以将按钮的可见性绑定到组合框的
  • 命令“git checkout”的含义。 [复制]

    这个问题在这里已经有答案了 虽然我知道标题中的命令类似于撤消对当前存储库的更改 但我无法理解它的实际工作原理或如何读取该命令 任何线索都会有很大的帮助 git 结账
  • Python 中的参数解析(必需与可选)

    我目前正在编写一个能够采用多个标志的脚本 我希望它无论最后一个参数是什么都应该是 start stop status usr bin env python from argparse import ArgumentParser def ar
  • Oracle 11g - FOR 循环仅将工作日插入表中?

    我想将一些数据插入与明年日期相关的表中 实际上我只需要插入工作日 BEGIN FOR i IN 1 365 LOOP INSERT INTO MY TABLE ID MY DATE VALUES i to date sysdate DD M
  • 如何以Python方式获取numpy argwhere函数的最大值

    我想使用 numpy argwhere 来查找数据中的最大值在哪里 下面是一个示例集 描述了我正在做的事情 bins np arange 10 data np array 6 4 8 5 np argwhere bins
  • 有没有办法加快 python 中处理大型 CSV 和数据帧的速度?

    我正在处理一些大小在 1Gb 到 2Gb 范围内的 CSV 文件 仅将文件加载到 pandas 数据帧中就需要 20 30 分钟 而我执行的每个操作则需要 20 30 分钟 例如按列名称过滤数据帧 打印 dataframe head 等 有
  • Hibernate从数据库生成ID函数

    我的代码是 Id GenericGenerator name generator strategy increment GeneratedValue generator generator Column name PM ID nullabl
  • 我可以将 struts.xml 文件更改为其他文件吗?

    当我研究 struts2 时 我遇到了一个典型的问题 问题是我可以改名字吗struts xml文件到其他东西并使其工作 您可以使用您的web xml
  • 在 Windows 7 32 位 SP1 上安装 Python 3.8

    我无法在 Windows 7 32 位 SP1 上安装 Python 3 8 错误日志显示detected windows 7 sp1 without kb2533625我一整天都在搜索这个更新 但没有找到任何帮助 我认为这是 Python
  • “沟通”扩展中的内容js和后台js文件

    我正在编写扩展程序 遇到一个问题 我无法将数据从扩展程序菜单发送到content js 在扩展菜单中 我有一些直觉 填写并单击按钮后 我写下它们的值 我想将它们发送到content js该数据将用于实施html但由于某种原因 数据没有发送
  • Ansible 将变量传递给角色

    我想根据环境和主机名创建文件夹 用户和组 我的剧本将环境和主机名传递给角色 该角色应该从 defaults main yml 文件中选择正确的数据 剧本 roles role myrole environment xxx hostname
  • cakephp 如何将 bootstrap 框架 css 样式包含到我的应用程序中?

    有人将 cake php 与 bootstrap 框架 css 风格集成在一起吗 我希望能够在 cakephp 视图中使用 bootstrap 的优点 像 btn 和面板引导样式 https i stack imgur com dnQyD
  • Visual Studio Community 2017 中的条件参考

    我正在创建一个多平台应用程序 我有一个多目标共享库 针对 netstandard 2 0 和 net 4 5 请参阅项目文件
  • 自动映射器合并对象问题

    让自动映射器工作后 上一个问题 https stackoverflow com questions 36602430 automapper complex types mapping exception 我正在解决另一个问题 把它带到另一个