2017-01-16 1 views
0

У меня есть отношения «один ко многим», определенные с помощью EntityFramework с кодовым кодом. Что-то вроде: BigEntity, который содержит SmallEntitiesList (список o SmallEntity).Как создать записи вставки в каркас объекта за одну поездку в базу данных

Whenver Я обновляю список 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, который является тем, что я использую).

+0

Пожалуйста, подтвердите свой ответ, надеюсь, это поможет вам. Я использую это в своих проектах. –

ответ

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();

+0

Оба ваших решения делают то же самое, нет никаких изменений в результате того же количества поездок в базу данных для каждого объекта. – user2997779

+0

Проверьте это. http://stackoverflow.com/questions/36209302/would-it-be-best-to-call-context-savechanges-only-once – TdAth

+0

Или просто используйте хранимую процедуру :) – TdAth

1

Если вы используете EF (версия 6) 6.1.3, то вы можете достичь этого с помощью EntityFramework.BulkInsert. Он будет вставлять список объектов в один звонок, что значительно улучшит производительность приложения. Форма больше информации проверьте это.

https://efbulkinsert.codeplex.com/

+0

Если вы не исправили это, это не будет работать с иерархией графов. Он вставит только один уровень. Вы также должны быть осторожны с параметрами «Массовая вставка», как если бы вы не были осторожны, он может обходить множество правил. –

+0

@ DanielLorenz извините, я не понял вашу точку зрения. Не могли бы вы рассказать мне, где я могу больше узнать о том, что вы сказали. Также вопрос заключался в том, чтобы вставить объемную вставку для отдельной Entity, и я думаю, что BulkInsert хорош для этого. –

+0

«У меня есть отношения« один ко многим », определенные с помощью кода EntityFramework с кодом« первый » Это означает, что он одновременно сохраняет родительский объект и его дочерние объекты. Ваше объемное решение вставки только вставляет родительский объект, а не дочерний, автоматически. Таким образом, вам придется циклически перемещать дерево вручную, что могло бы вызвать проблемы в будущем. –

0

Отказ от ответственности: Я владелец Entity Framework Extensions

Эта библиотека поддерживает все основные providor в том числе:

  • Oracle DevArt
  • Oracle DataAccess
  • Oracle DataAccessManaged

Эта библиотека позволяет выполнять все массовые операции, необходимые для сценариев:

  • Сыпучие SaveChanges
  • Bulk Вставьте
  • Bulk Удалить
  • Массовое обновление
  • Объём слияния

Пример

// 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; 
}); 
Смежные вопросы