原因:

数据库中的两个表是主从表关系,但是没有建外键,而表的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. Jmeter-简介及安装

    一.Jmeter简介 Apache Jmeter 是Apache组织的开放源代码项目,是一个纯java桌面应用,用于压力测试和性能测量.它最初被设计用于Web应用测试但后来扩展到其它测试领域. Apa ...

  2. sql server和my sql 命令(语句)的区别,sql server与mysql的比较

    sql与mysql的比较 1.连接字符串sql  :Initial Catalog(database)=x;  --数据库名称      Data Source(source)=x;        - ...

  3. ScrollView示例(转载)

    // 初始化var scrollView = new ccui.ScrollView(); // 设置方向scrollView.setDirection(ccui.ScrollView.DIR_VER ...

  4. phpstorm汉化包

    链接:https://pan.baidu.com/s/1dG7AWI87dOJJezra9veFrA 提取码:btmf 下载后放到lib目录中 即可

  5. 02 Django虚拟环境搭建

    01 创建虚拟环境目录 该目录用于存放所有虚拟环境. cd / mkdir venv cd venv 02 创建当前项目的虚拟环境 virtualenv --python=/usr/bin/pytho ...

  6. 增删改查-删除(php)

    <!DOCTYPE html> <html><script type="text/javascript" src="jquery-1.11. ...

  7. 解决pycharm创建github工程但push失败的问题

    1.运行git-cmd.exe; 2.d:   cd  工程路径 3.执行命令:git remote set-url origin https://github.com/wawj901124/jmet ...

  8. linux网卡

    手动启动 ifup eth0 查询网卡配置信息 vim /etc/udev/rules.d/70-persistent-net.rules 备注:可以修改网卡名称和MAC地址

  9. css div布局示例2(head-main-footer

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. laravel实现excel表的导入导出功能

    1.这是个我去公司之后曾经折磨我很久很久的功能查阅了很多资料但是功夫不负有心人在本人的不懈努力下还是实现了这个功能 (ps看不懂我下面说讲述的可以参考这个laravel学院的官方文档 https:// ...