使用自动映射器手动映射对象列表

如何解决使用自动映射器手动映射对象列表

我正在使用自动映射器将一个复杂的对象映射到另一个对象,在该对象中,源对象具有其属性与目标中的对象列表不匹配的对象列表。

因此,我正在使用Linq手动遍历源代码中的列表,并将其映射到目标对象。

问题是,目标对象是数据库对象:

源对象:

public class AutomationDetailsResponse
    {        
        public Guid ServiceId { get; set; }    
        
        public int EngagementId { get; set; } 
        
        public string ServiceRequestName { get; set; }      
        
        public Guid ServiceRequestGUID { get; set; }    
        
        public string OfficeId { get; set; }
        
        public string CountryId { get; set; }  
        
        public string EngagementCode { get; set; }  
        
        public string CanvasDocumentUri { get; set; }  
        
        public string CanvasAudienceUri { get; set; }     

        public List<RequestFile> InputRequestFiles { get; set; }  
        
        public List<RequestFile> OutputRequestFiles { get; set; }  
        
        public string Status { get; set; }       

        public string RequestInitiatedByName { get; set; }    
        
        public string RequestInitiatedBy { get; set; }   
        
        public int DataCenterId { get; set; }   
        
        public DateTime CreatedAt { get; set; }  
        
        public DateTime LastUpdatedAt { get; set; }       

        public List<ActivityFeed> ActivityFeeds { get; set; }   
        
        public List<Guid> TaskIds { get; set; }

        [JsonProperty("Id")]
        public int CanvasRequestId { get; set; }
    }

    public class RequestFile
    {       
        public Guid Id { get; set; }       
        public int FileSequence { get; set; }       
        public Guid GroupId { get; set; }       
        public string GroupName { get; set; }       
        public string FileType { get; set; }       
        public string FileName { get; set; }       
        public int FileSize { get; set; }        
        public Guid DocumentId { get; set; }

        public DateTime CreatedAt { get; set; }
    }

    public class ActivityFeed
    {       
        public int CreatedById { get; set; }       
        public DateTime CreatedAt { get; set; }      
        public string Description { get; set; }       
        public int ActivityType { get; set; }       
        public string UserName { get; set; }        
        public int Id { get; set; }
    }

目标对象:

[Table(nameof(AutomationRequest),Schema = Schemas.SAH)]
    public class AutomationRequest : EntityBase,ICreatedDate,IModifiedDate
    {
        [Required]
        public int CanvasEnvironmentId { get; set; }

        [Required]
        public Guid AppInstanceId { get; set; }

        public Guid CanvasRequestGUID { get; set; }

        public int CanvasRequestId { get; set; }      
        
        public int DownstreamStatusId { get; set; }

        [Required]
        public int CanvasStatusId { get; set; }

        [Required]
        public Guid ServiceCatalogId { get; set; }

        [Required]
        public string RequestName { get; set; }

        [Required]
        [MaxLength(255)]
        public string EngagementId { get; set; }        

        [Required]
        public int CountryId { get; set; }

        [Required]
        public int DataCenterId { get; set; }

        public bool IsDeletedFromSAH { get; set; }

        public bool IsDeletedFromCAH { get; set; }

        [MaxLength(500)]
        public string CreatedByEmail { get; set; }

        [MaxLength(500)]
        public string CreatedByName { get; set; }

        [Required]
        public DateTime CreatedDate { get; set; }

        [MaxLength(38)]
        public string ModifiedBy { get; set; }

        [MaxLength(50)]
        public string OriginatedFrom { get; set; }

        [Required]
        public DateTime ModifiedDate { get; set; }

        public string NavigationUrl { get; set; }

        public int? Version { get; set; }

        [ForeignKey(nameof(CanvasEnvironmentId))]
        public virtual Environment CanvasEnvironment { get; set; }

        [ForeignKey(nameof(CountryId))]
        public virtual Country Country { get; set; }

        [ForeignKey(nameof(ServiceCatalogId))]
        public virtual ServiceCatalog ServiceCatalog { get; set; }

        [ForeignKey(nameof(CanvasStatusId))]
        public virtual AutomationRequestStatus CanvasStatus { get; set; }        

        public virtual ICollection<AutomationRequestInputFile> InputFiles { get; set; }

        public virtual ICollection<AutomationRequestOutputFile> OutputFiles { get; set; }

        public virtual ICollection<AutomationRequestTask> Tasks { get; set; }
    }
[Table(nameof(AutomationRequestInputFile),Schema = Schemas.SAH)]
    public class AutomationRequestInputFile : EntityBase,IModifiedDate
    { 
        [Required]
        public Guid CanvasGroupId { get; set; }
        
        public Guid CanvasDocumentId { get; set; }

        [MaxLength(255)]
        public string FileName { get; set; }

        [MaxLength(38)]
        public string CreatedBy { get; set; }

        [Required]
        public DateTime CreatedDate { get; set; }

        [MaxLength(38)]
        public string ModifiedBy { get; set; }

        [Required]
        public DateTime ModifiedDate { get; set; }

        [Required]        
        public Guid AutomationRequestId { get; set; }      
        
        public string FileType { get; set; }

        [ForeignKey(nameof(AutomationRequestId))]
        public virtual AutomationRequest AutomationRequest { get; set; }

       
    }
 public class EntityBase
    {
        public EntityBase()
        {
            Id = Guid.NewGuid();
        }

        public Guid Id { get; set; }
    }

这是映射配置:

CreateMap<AutomationDetailsResponse,AutomationRequest>()
                .ForMember(dst => dst.Id,opt => opt.Ignore())
                .ForMember(
                    dst => dst.CanvasRequestGUID,opt => opt.MapFrom(src => src.ServiceRequestGUID))
                .ForMember(
                    dst => dst.RequestName,opt => opt.MapFrom(src => src.ServiceRequestName))
                .ForMember(
                    dst => dst.InputFiles,opt => opt.MapFrom(src => src.InputRequestFiles.Select(x => new AutomationRequestInputFile { CanvasGroupId = x.GroupId,CanvasDocumentId = x.DocumentId,FileName = x.FileName,FileType = x.FileType })))
                .ForMember(
                    dst => dst.OutputFiles,opt => opt.MapFrom(src => src.OutputRequestFiles.Select(x => new AutomationRequestOutputFile { CanvasDocumentId = x.DocumentId,FileType = x.FileType,FileSize = x.FileSize,CreatedDate = x.CreatedAt })))
                .ForMember(
                    dst => dst.CreatedByName,opt => opt.MapFrom(src => src.RequestInitiatedByName))
                 .ForMember(
                    dst => dst.CreatedDate,opt => opt.MapFrom(src => src.CreatedAt))
                 .ForMember(
                    dst => dst.ModifiedDate,opt => opt.MapFrom(src => src.LastUpdatedAt))
                 .ForMember(
                    dst => dst.Tasks,opt => opt.MapFrom(src => src.TaskIds.Select(x => new AutomationRequestTask { CanvasId = x })))
                ;

映射有效。问题是这样的:

var automation = await _dbContext.AutomationRequests.FirstOrDefaultAsync(x => x.CanvasRequestGUID == automationDetails.ServiceRequestGUID);
 _mapper.Map(automationDetails,automation);
 _dbContext.Update(automation);
 await _dbContext.SaveChangesAsync();

更新失败,因为在映射配置中,我们将创建一个新实例AutomationRequestInputFile,该实例将触发EntityBase中的构造函数,并创建一个新ID。 EF Core尝试更新该行时,由于ID已更改,因此找不到该记录。

我已经尝试解决这一问题了1天,但还没有取得任何进展。

感谢您的帮助。

谢谢。

解决方法

您没有正确使用AutoMapper,因为您仍在手动构造AutomationRequestInputFile对象(通过使用LINQ .Select())。

解决方案是为RequestFileAutomationRequestInputFile添加第二个映射,并删除“ InputFiles”属性的MapFrom配置中的“选择”。

这是一个有效的.NET小提琴(省略了您的问题中未提供的属性和类型):https://dotnetfiddle.net/9qizfk

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-