如何使实体框架在一次数据库中插入条目

时间:2017-01-16 09:15:00

标签: c# .net entity-framework ef-code-first

我与EntityFramework代码优先定义了一对多关系。类似于:BigEntity包含SmallEntitiesList(SmallEntity的列表o)。

当我更新该对象的SmallEntities列表并执行dbContext.SaveChanges()时,我可以在SQL记录器中看到Entity Framework 通过为每个项目进行数据包往返来插入这些项目

所以日志看起来像这样:

Log for inserting SmallEntities

这些插件中的每一个都是这样的:

DECLARE
  updatedRowid ROWID;
BEGIN


INSERT INTO SOME_TABLE(...)
VALUES (...)

RETURNING ROWID INTO updatedRowid;
OPEN '' /* @outParameter */ FOR SELECT
     SOME_TABLE 
FROM SOME_TABLE 
WHERE ROWID = updatedRowid;
END;

有没有办法让实体框架的行为与众不同,并使这些插件为每一个插入数据库?

UPDATE:已经尝试过BulkInsert(不支持Oracle DevArt,这就是我正在使用的内容)。

3 个答案:

答案 0 :(得分:1)

如果您使用EF(版本6)6.1.3,那么您可以使用提供的EntityFramework.BulkInsert扩展来实现此目的。它将在单个调用中插入对象列表,这将极大地提高应用程序性能。  请填写更多信息,然后查看。

https://efbulkinsert.codeplex.com/

答案 1 :(得分:0)

foreach(var item in ListItems)
{
  context.Entry(item).State = System.Data.EntityState.Added;
  context.Add(item);
}

context.SaveChanges();

foreach (var item in objectList)
{
  context.YourObject.AddObject(item );
}

context.SaveChanges(SaveOptions.None);

研究 - BulkInsert();

答案 2 :(得分:0)

免责声明:我是Entity Framework Extensions

的所有者

该库支持所有主要提供者,包括:

  • Oracle DevArt
  • Oracle DataAccess
  • Oracle DataAccessManaged

此库允许您执行场景所需的所有批量操作:

  • 批量保存更改
  • 批量插入
  • 批量删除
  • 批量更新
  • 批量合并

实施例

// Easy to use
context.BulkSaveChanges();

// Easy to customize
context.BulkSaveChanges(bulk => bulk.BatchSize = 100);

// Perform Bulk Operations
context.BulkDelete(customers);
context.BulkInsert(customers);
context.BulkUpdate(customers);

// Customize Primary Key
context.BulkMerge(customers, operation => {
   operation.ColumnPrimaryKeyExpression = 
        customer => customer.Code;
});