使用Entity Framework进行批量插入/更新的有效方法

Ian*_*ton 26 entity-framework

我有一个实体列表,我想将它们插入到数据库中.如果实体已经存在于数据库中,则需要跳过该实体.如果它在数据库中但具有不同的值,那么它需要更新.

除了每个项目进行数据库调用之外,还有什么方法可以做到这一点吗?

我的计划是尝试插入,如果抛出键上的唯一约束异常,则执行更新.

ken*_*n2k 25

在这种情况下,不要使用Entity Framework.只需使用存储过程(如何依赖于您使用EF的版本/方法,您可能必须扩展您DbContext的实体模型或从实体模型添加映射).

如果您使用的SQL Server,那么你的存储过程中,使用该MERGE命令有效不正是你所需要的:如果它插入,如果它不存在,或更新.一个高效的SQL查询中的所有内容.

  • Urrghhhhhh我讨厌这就是答案. (25认同)

phi*_*ady 11

EF不适合BULK刀片.对于1000个记录来说还可以,但是大数(100k以上)它的速度很慢.

如果您打算使用EF.

  • 尝试AddOrUpdate方法,(而不是插入/更新)
  • 禁用跟踪,
  • 提交每1000条或更少的记录.

例如

Context.Set<TPoco>().AddOrUpdate(poco);
//...
Context.Configuration.AutoDetectChangesEnabled =
//..
Context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

如果复制不相关的数据,您可以并行尝试这些表(doh)


max*_*ego 9

我为https://efbulkinsert.codeplex.com/做了扩展

它使用起来非常简单

using(var context = new MyDbContext())
{
    context.BulkInsert(hugeCollectionOfEntities);
}
Run Code Online (Sandbox Code Playgroud)

  • 只是抬头:这个库不支持导航属性.如果您有父子表关联,则插入后子表元素的外键将设置为0 (6认同)
  • 这不处理事情的更新方面. (3认同)