Есть ли какие-либо варианты для массовой вставки в несколько связанных таблиц с помощью Entity Framework (SQL Server 2008 r2 target)? - PullRequest
3 голосов
/ 19 декабря 2011

Существуют опции для массовой вставки в одну таблицу с сущностями EF.В частности, этот вопрос SO и использование этого класса от Дэвида Брауна .

Однако в случае массовой вставки строк в родительскую и дочернюю таблицуНичто не выскакивает как опция при том же уровне удобства.

Я могу придумать «хаки» (но я надеюсь, что есть хотя бы один лучший вариант):

  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 для массовой вставки в связанные таблицы?

Спасибо !!

1 Ответ

0 голосов
/ 19 декабря 2011

Первое правило любого ограничения внешнего ключа заключается в том, что оно должно существовать в виде первичного ключа или ограничения уникальности в другой таблице перед вставкой в ​​таблицу внешнего ключа.

Это прекрасно работает, когда вы добавляете несколько строк за раз (традиционная среда обработки транзакций). Однако вы пытаетесь выполнить массовую вставку в оба одновременно. Я бы назвал это как пакетная обработка. По сути, блокировка массового обновления родительской таблицы блокирует ее чтение дочерней таблицей, чтобы проверить правильность связи fk.

Я бы сказал, что вашими 2 вариантами будут 1.) полностью исключить fk или 2.) Установите fk как nocheck перед массовой вставкой, затем включите проверку после завершения массовой вставки с таблицей изменений.

...