Abp中ef操作新增重复子级数据问题

2024-04-12 20:44

本文主要是介绍Abp中ef操作新增重复子级数据问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在偶然开发中,导入的多条数据中,可能都存在同一个字段生成主外键关联子级数据的逻辑,此时循环去生成子级数据,会导致重复添加子级数据,有点绕吧,那就那实例说吧

如下:实现导入两条论文数据,论文中有起草人和所在单位,而起草人和所在单位是多对多关系,

这里讲下额外题,多表之间的关系:

  1. 一对一:外键+主键,主键和主键匹配(一对一关系的表会直接安排成一张表)
  2. 一对多,多对一:主键+外键
  3. 多对多:通过中间表连接两张或多张表直接的联系

所以在论文循环时,会遇到多个起草人关联的是同一个企业,企业名称一样,本该是一条数据,但是却关联了多次,且id也会不一样,就会导致在数据库插入起草人数据时,会关联插入多次同一个企业信息,这就导致了重复的企业数据

input.ForEach(s =>{s.DataSources = SystemConstants.StandardSource;var enterprises = MapToEnterprises(s.Affiliations, companys, enterpriseList);companys.AddRange(enterprises);var talents = MapToTalents(s.Talents, enterprises, newTalents, exsitTalents);newTalents.AddRange(talents);var domain = new Standard().SetId(GuidGenerator.Create());SetStandard(s, domain, talents, true);domains.Add(domain);//增加企业或创新平台成果关系var platFormList = s.Affiliations.Where(m => m.EntityType == SystemConstants.innovationplatform).ToList();var plats = MapToPlatforms(platFormList, platForms, innovationPlatforms);innovationPlatforms.AddRange(plats);platMappings.AddRange(ScientficResultAddEInnoList(domain.Id, enterprises, plats));
});

 此处是之前的企业数据,由于这两条论文中的起草人都存在同一个人和所属企业,如上面的excel模板总起草人都有"河南大学-王清北"以及 所在单位”河南大学“,则就导致会在循环生成河南大学企业时会生成两遍

/// <summary>
/// 转化企业实体
/// </summary>
/// <param name="dtos"></param>
/// <param name="enterprises"></param>
/// <returns></returns>
private List<Enterprise> MapToEnterprises(List<SRInnoPlatEpriseDo> dtos, List<Enterprise> newEnterprises, List<Enterprise> enterprises)
{var es = new List<Enterprise>();var existEs = enterprises.Where(s => dtos.Select(d => d.Name).Contains(s.EnterpriseName)).ToList();es.AddRange(existEs);var newEs = dtos.Where(s => s.EntityType == SystemConstants.Enterprise && !enterprises.Select(e => e.EnterpriseName).Contains(s.Name)).Select(s => new Enterprise(GuidGenerator.Create(), s.Name, false, "-", "-", SystemConstants.ImportSource)).ToList();es.AddRange(newEs);return es.Distinct().ToList();
}/// <summary>
/// 转化人才实体
/// </summary>
/// <param name="dtos"></param>
/// <param name="enterprises"></param>
/// <param name="enterpriseList"></param>
/// <returns></returns>
private List<Talent> MapToTalents(List<TalentBaseDo> dtos, List<Enterprise> enterprises,List<Talent> newExistTalents, List<Talent> existTalent = null)
{List<Talent> talents = new List<Talent>();dtos.ForEach(s =>{var items = s.Name.Split('-');var enterprise = enterprises.FirstOrDefault(e => e.EnterpriseName == items[0]);var talent = existTalent.FirstOrDefault(t => t.Name == items[1] && t.EnterpriseName == items[0]);var newTalent = newExistTalents.FirstOrDefault(t => t.Name == items[1] && t.EnterpriseName == items[0]);if (talent != null){talents.Add(talent);}else if (newTalent != null){talents.Add(newTalent);}else{var newTelent = new Talent().SetId(GuidGenerator.Create()).SetName(items[1]).SetEnterpriseName(items[0]).SetJobTitle(string.Empty).SetArea(string.Empty).SetIsGreen(false);newTelent.Enterprise = new List<Enterprise>();newTelent.Enterprise.Add(enterprise);talents.Add(newTelent);}});return talents.Distinct().ToList();
}

最简单的解决方式就是每次循环记录下生成的企业信息插入到全局对象中,然后再在每次处理转化企业实体时,过滤下上次已生成的企业信息,直接用上次生成的企业信息,不再重新生成,

代码修改如下:

/// <summary>
/// 转化企业实体
/// </summary>
/// <param name="dtos"></param>
/// <param name="enterprises"></param>
/// <returns></returns>
private List<Enterprise> MapToEnterprises(List<SRInnoPlatEpriseDo> dtos, List<Enterprise> newEnterprises, List<Enterprise> enterprises)
{var es = new List<Enterprise>();var existEs = enterprises.Where(s => dtos.Select(d => d.Name).Contains(s.EnterpriseName)).ToList();var newExistEs = newEnterprises.Where(s => dtos.Select(d => d.Name).Contains(s.EnterpriseName)).ToList();es.AddRange(existEs);es.AddRange(newExistEs);var newEs = dtos.Where(s => s.EntityType == SystemConstants.Enterprise && !enterprises.Select(e => e.EnterpriseName).Contains(s.Name)&& !newEnterprises.Select(e => e.EnterpriseName).Contains(s.Name)).Select(s => new Enterprise(GuidGenerator.Create(), s.Name, false, "-", "-", SystemConstants.ImportSource)).ToList();es.AddRange(newEs);return es.Distinct().ToList();
}

经测试

        虽然每个起草人都关联了新创建的id=1的这条还未真实插入到数据库的企业,abp中ef会自动判断只插入一条id=1的企业,第二条及之后的起草人都会关联这一条id=1的企业,而不会每次都重新插入,之前的方式因为同一个企业生成了多个id,导致每次插入起草人时,关联的子级企业也会重新再插入

这篇关于Abp中ef操作新增重复子级数据问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/898190

相关文章

MySQ中出现幻读问题的解决过程

《MySQ中出现幻读问题的解决过程》文章解析MySQLInnoDB通过MVCC与间隙锁机制在可重复读隔离级别下解决幻读,确保事务一致性,同时指出性能影响及乐观锁等替代方案,帮助开发者优化数据库应用... 目录一、幻读的准确定义与核心特征幻读 vs 不可重复读二、mysql隔离级别深度解析各隔离级别的实现差异

Java整合Protocol Buffers实现高效数据序列化实践

《Java整合ProtocolBuffers实现高效数据序列化实践》ProtocolBuffers是Google开发的一种语言中立、平台中立、可扩展的结构化数据序列化机制,类似于XML但更小、更快... 目录一、Protocol Buffers简介1.1 什么是Protocol Buffers1.2 Pro

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

Python使用python-pptx自动化操作和生成PPT

《Python使用python-pptx自动化操作和生成PPT》这篇文章主要为大家详细介绍了如何使用python-pptx库实现PPT自动化,并提供实用的代码示例和应用场景,感兴趣的小伙伴可以跟随小编... 目录使用python-pptx操作PPT文档安装python-pptx基础概念创建新的PPT文档查看

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

MySQL 数据库表与查询操作实战案例

《MySQL数据库表与查询操作实战案例》本文将通过实际案例,详细介绍MySQL中数据库表的设计、数据插入以及常用的查询操作,帮助初学者快速上手,感兴趣的朋友跟随小编一起看看吧... 目录mysql 数据库表操作与查询实战案例项目一:产品相关数据库设计与创建一、数据库及表结构设计二、数据库与表的创建项目二:员

Python实现数据可视化图表生成(适合新手入门)

《Python实现数据可视化图表生成(适合新手入门)》在数据科学和数据分析的新时代,高效、直观的数据可视化工具显得尤为重要,下面:本文主要介绍Python实现数据可视化图表生成的相关资料,文中通过... 目录前言为什么需要数据可视化准备工作基本图表绘制折线图柱状图散点图使用Seaborn创建高级图表箱线图热

Linux部署中的文件大小写问题的解决方案

《Linux部署中的文件大小写问题的解决方案》在本地开发环境(Windows/macOS)一切正常,但部署到Linux服务器后出现模块加载错误,核心原因是Linux文件系统严格区分大小写,所以本文给大... 目录问题背景解决方案配置要求问题背景在本地开发环境(Windows/MACOS)一切正常,但部署到