原因:

数据库中的两个表是主从表关系,但是没有建外键,而表的id用的是数据库的自增整数,导致在使用EF导入主从表数据时,需要先保存主表数据,取到

主表的自增id后才能插入从表数据,这样循环之下,数据插入速度非常慢。

经过查询得知:

即使在数据库中没有建立外键关系,也可以在EF中通过关系建议主从表关系,从而达到批量导入主从表数据的目的。

具体实现:

首先model中需要添加主从表的关系属性

主表

[Table("DataHubEmployee")]
public partial class DataHubEmployee : SecuredEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int pkDataHubEmployee { get; set; }
public int fkDataHubBatch { get; set; }
public int? OriginalBatchId { get; set; }
public int EmployeeId { get; set; }
public string ClientCode { get; set; }
public virtual ICollection<DataHubDependant> DataHubDependants { get; set; }
}

从表

[Table("DataHubDependant")]
public partial class DataHubDependant : SecuredEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int pkDataHubDependant { get; set; }
public int? OriginalBatchId { get; set; }
public string ClientCode { get; set; }
public int fkDataHubEmployee { get; set; }
public string EmployeeId { get; set; }
public string FullName { get; set; }
public virtual DataHubEmployee DataHubEmployee { get; set; }
}

然后EF的DbContext中的OnModelCreating对实体的外键关联进行注册

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Properties<decimal>().Configure(c => c.HasPrecision(, ));
//add model mapping for auto process
modelBuilder.Entity<DataHubDependant>()
.HasRequired(d => d.DataHubEmployee)
.WithMany(e => e.DataHubDependants)
.HasForeignKey(d => d.fkDataHubEmployee); modelBuilder.Entity<DependantChangeLog>()
.HasRequired(d => d.EmployeeChangeLog)
.WithMany(e => e.DependantChangeLogs)
.HasForeignKey(d => d.fkEmployeeChangeLog);
//close auto migration
Database.SetInitializer<ClientDbContext>(null);
base.OnModelCreating(modelBuilder);
}

说明:这里可以通过.HasForeignKey(d => d.fkDataHubEmployee);来指定从表中的哪个字段是外键。如果不指定,EF会自动生产一个包含外键的新列。

批量插入数据

    foreach (var dataHubEmployeeDTO in dataHubEmployeeDtoList)
{
if (batchType == "MonthlyData" && dataHubEmployeeDTO.Status.ToUpper() == "Terminated".ToUpper())
{
continue;
}
DataHubEmployee dataHubEmployee = new DataHubEmployee
{
EmployeeId = dataHubEmployeeDTO.EmployeeId,
fkDataHubBatch = dataHubBatch.pkDataHubBatch,
OriginalBatchId = batchId,
ClientCode = dataHubEmployeeDTO.ClientCode, DataHubDependants = new List<DataHubDependant>()
}; //插入重表数据
//获取当前批员工列表
foreach (var dependant in dataHubEmployeeDTO.DependantList)
{
var dataHubDependant = new DataHubDependant
{
OriginalBatchId = batchId,
ClientCode = dataHubEmployeeDTO.ClientCode,
fkDataHubEmployee = dataHubEmployee.pkDataHubEmployee,
EmployeeId = dataHubEmployeeDTO.ID,
FullName = dependant.FullName,
Identification = dependant.Identification,
BirthDate = dependant.BirthDate,
Gender = dependant.Gender,
Nationality = dependant.Nationality, };
dataHubEmployee.DataHubDependants.Add(dataHubDependant);
}
clientDbContext.DataHubEmployee.Add(dataHubEmployee);
} clientDbContext.SaveChanges();

这样就可以在批量插入数据的时候,自动填充主表的自增ID到从表。

EntityFramework 插入自增ID主从表数据的更多相关文章

  1. 在GridControl表格控件中实现多层级主从表数据的展示

    在一些应用场景中,我们需要实现多层级的数据表格显示,如常规的二级主从表数据展示,甚至也有多个层级展示的需求,那么我们如何通过DevExpress的GridControl控表格件实现这种业务需求呢?本篇 ...

  2. 九:MVC主从表数据加载

    EF对关联表数据加载的三种方式: 延迟加载:只有在需要的时候加载数据.EF默认的加载方式. 贪婪加载:一次性组织好数据,全部加载到内存中. 显式加载:需要通过代码手动加载关联表. 延迟加载 virtu ...

  3. EF里单个实体的增查改删以及主从表关联数据的各种增删 改查

    本文目录 EF对单个实体的增查改删 增加单个实体 查询单个实体 修改单个实体 删除单个实体 EF里主从表关联数据的各种增删改查 增加(增加从表数据.增加主从表数据) 查询(根据主表找从表数据.根据从表 ...

  4. SQL Server中获取最新插入的自增ID

    SCOPE_IDENTITY()函数 返回的是紧跟这个插入语句生成的自增ID, 若果前一个语句不是插入自增ID的,将返回NULL @@IDENTITY 返回全局的最有一个生成的自增ID,全局可用 cr ...

  5. SQL Server 的 主键 解决方案 NEWID() , 自增ID

    在 SQL Server 表的主键有自增Id ,和  GUID. 1.  自增Id 优点:索引空间小,索引连续.在大量数据插入的时候性能有特别大的优势. 缺点:可移植性差,在数据迁移的时候. 2. G ...

  6. DevExpress主从表 按组分页一组不足一页为一页--以此记录

    本文的主要是说明Dev的报表的主从表,主从表的每一组显示在一页,当一组超出一页,第二页只显示第一组的. 一.每上报表设置图 简单设计图如上 二.后台代码 报表页代码 public partial cl ...

  7. DataSnap ClientdataSet 三层中主从表的操作

    非原创  摘自:http://hi.baidu.com/yagzh2000/blog/item/fc69df2cb9845de78b139946.html三层中主从表的操作(删除.新增.修改)一定要在 ...

  8. 【mysql】 mybatis实现 主从表 left join 1:n 一对多 分页查询 主表从表都有查询条件 【mybatis】count 统计+JSON查询

    mybatis实现 主从表 left join  1:n 一对多 分页查询   主表从表都有查询条件+count 需求: ======================================= ...

  9. sqlserver 自增ID插入指定数据

    set identity_insert 表名 ON --允许对自增列Id插入指定数据 insert into table_name(Id,Name) values(1,'test') set iden ...

随机推荐

  1. Introduction to Writing Functions in R

    目录 在R中编写函数 args(函数名) 创建一个函数的步骤 1.default args Passing arguments between functions Checking arguments ...

  2. Spring - Spring Boot - Thymeleaf - textual 模式

    概述 thymeleaf 的 text 模式简单使用 过程会比较啰嗦, 需要结论的同学, 可以直接到底部去寻找 背景 想尝试做一个简单的 模板工具 目的 自动生成一些简单的 重复文本 思路 尽量简单 ...

  3. 【JS】网站运行时间

    <span id="sitetime"></span> <script language=javascript> function siteTi ...

  4. 解决jmeter 24h长时间压测-o生成报告文件达到几个g以及以上的问题

    问题描述:jmeter执行稳定性测试时,因时间过长,导致jtl文件过大,生成html报告过程报内存溢出错误(增加内存配置也不能解决) 使用 jmeter -n -t    test.jmx   -l  ...

  5. java面试题错题集(牛客网错题)

    一.关于Object类的说法正确 Java中所有的类都直接或间接继承自Object,无论是否明确的指明,无论其是否是抽象类. Object的equals方法,只有一句话,return this==ob ...

  6. util之Set

    1.定义: Set<Integer>set = new TreeSet<Integer>(); 注意: TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不 ...

  7. cvtColor(src, src_gray, CV_BGR2GRAY)报错

    利用cvtColor 进行灰度转换时,不能将  灰度图 转为灰度图,所以在转换前,需对原始图像进行判断. 将这个改成以下 int main(int argc, char* argv[]) { Mat ...

  8. 用OpenCV读取摄像头

    首先插入摄像头 在电脑中查看 #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp ...

  9. Scale9Sprite 的 setCapInsets中需要注意的地方

    在设置 setCapInsets()方法的y参数的时候,不直接取cocosStudio中的y,而是取Scale9Sprite.height - cocosStudio中的y.

  10. index unique scan 与index range scan等的区别

    存取Oracle当中扫描数据的方法(一) Oracle 是一个面向Internet计算环境的数据库.它是在数据库领域一直处于领先地位的甲骨文公司的产品.可以说Oracle关系数据库系统是目前世界上流行 ...