sql-server - 是否有任何选项可以使用 Entity Framework (sql server 2008 r2 目标)对多个相关表进行批量插入?

标签 sql-server sql-server-2008 entity-framework entity-framework-4 bulkinsert

现有选项可用于将批量插入到具有 EF 实体的单个表中。具体来说,this SO question并使用 this class from David Browne .

然而,在尝试将行批量插入到父表和子表的情况下,没有任何东西可以作为同样方便的选项。

我能想到的“技巧”(但我希望至少有一个更好的选择)包括:

  1. 在插入之前生成 PK 并设置 FK(在这种情况下,我们知道没有其他任何东西同时插入),然后对两者进行批量插入(如有必要,在父插入期间关闭 IDENTITY_INSERT)
  2. 批量插入(使用链接的 SO 问题的方法)父行,选择它们(足够的列来识别哪个父行是哪个),生成子行,批量插入那些
  3. 生成在单个批处理中插入所有行所需的 sql,先执行每个父项,然后执行所有相关的子项,使用@@identity 为子项插入填写 FK

“预生成 PK 值”方法(我还没有真正尝试过)看起来不错,但是很脆弱(在操作期间至少不需要向父级插入其他内容)并且取决于空表或选择 max(pk )+1 。

SqlBulkCopy似乎是围绕一次插入一个表构建的(如 bcp),任何仍然让 sql 生成 PK/identity 列的东西似乎都是围绕“下拉”到 ado.net 并构建 sql 构建的。

除了我缺少的“生成大量 sql”之外,是否还有其他选项?如果没有,是否有已经生成用于批量插入相关表的 sql 的东西?

谢谢!!

最佳答案

任何外键约束的第一条规则是,在插入外键表之前,它必须作为主键或唯一约束存在于另一个表中。

当您一次添加几行时(传统事务处理环境),这非常有用。然而,您正试图同时批量插入两者。我将其称为批处理。基本上,父表上的批量更新锁将阻止子表读取它以检查 fk 链接是否有效。

我会说您的 2 个选项是 1.) 完全不使用 fk 或 2.) 在批量插入之前将 fk 设置为 nocheck,然后在使用更改表完成批量插入后打开检查。

关于sql-server - 是否有任何选项可以使用 Entity Framework (sql server 2008 r2 目标)对多个相关表进行批量插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8554403/

相关文章:

c# - 如何格式化存储过程以映射 EF 对象和自定义数据

c# - 通用类型 T 作为变量名

java - 如何获取具有重复数据的数据库记录的最大行ID

sql - ID 的 CSV 到值的 CSV

sql-server - SQL Server 何时以及如何在存储过程中处理内存中的变量?

c# - 从 2 个查询中选择更好的查询,都返回相同的结果

sql-server - SQL Server 连接任意返回 233 或 18456 错误代码

SQL 锁定范围,竞争条件预防

c# - 使用C#同步不同数据库中的两个表

c# - Entity Framework Eager 只加载其他表的一个子集