原因:

数据库中的两个表是主从表关系,但是没有建外键,而表的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. 插件与App的跳转,及路由的关系

    在SDK中 无法直接跳App 的界面,这个时候需要使用 路由,或者通过 NSClassFromString 的 presentViewController 来跳转. 直接贴代码: UIViewCont ...

  2. JMeter CSRFToken认证登陆(正则提取器的使用)

    转自:http://blog.csdn.net/lion19930924/article/details/51189210 前几天用JMeter模拟登陆,但是这个网站开启了csrf认证,因此在post ...

  3. [TJOI2017] DNA - 后缀数组,稀疏表

    [TJOI2017] DNA Description 求模式串与主串的匹配次数,容错不超过三个字符. Solution 枚举每个开始位置,进行暴力匹配,直到失配次数用光或者匹配成功.考虑到容错量很小, ...

  4. Android 开发 微信分享,登陆,获取信息

    1 获取appid和appsecret.        https://open.weixin.qq.com/cgi-bin/index?t=home/index&lang=zh_CN     ...

  5. 自制yum源离线安装ansible

    适应场景 在实际生产环境中,服务器往往是不能访问互联网,如果简单的下载ansible源码安装,会碰到缺少各种依赖包的问题,因此,推荐制作yum源,然后使用yum安装ansible. 实验环境 模拟可以 ...

  6. 第一篇,VScode插架以及配置项

      由于在开发的时候我们经常因为ESLint规范把自己搞的头晕眼花,修改起来又很浪费时间.所以我特别做个记录,如下代码可以轻松搞的.   工欲善其事必先利器,如果想要在开发的道路上如履平地必须要有得心 ...

  7. jQuery 抖动特效函数封装

    <style> ul{ margin-top: 100px; } li { float: left; margin-left: 20px; position: absolute; top: ...

  8. 大数据-redis

    redis 分布式缓存数据库 单节点安装 tar -zxvf redis-3.2.9.tar.gz cd /opt/sxt/redis-3.2.9 yum -y install gcc tcl (依赖 ...

  9. 在虚拟机中使用Git

    自己如何从安装虚拟机到使用git进行项目代码版本管理的部分教程因为是自学所以没有好的教程只能自己进行百度,网上的教程太多了但都是只是一个模块没有从头到尾详细的教程,我们如果有个详细的教程本来只需花很少 ...

  10. OpenCV之XML和YAML文件读写

    FileStorage类 该类有两个构造函数 FileStorage::FileStorage() FileStorage::FileStorage(const string& source, ...