Как выполнить массовую вставку двух таблиц данных, имеющих отношение Identity

Я использую SQLBulkCopy, в псевдокоде делаю так:

  • сделать нового сотрудника доступным для данных
  • сделать новый EmployeeAddress доступным для данных
  • заполнить таблицу сотрудников, но не указывать employeeId как личность
  • заполнить объект данных EmployeeAddress, но он содержит поле employeeId
  • запишите обе таблицы данных в базу данных, сделав это дважды и изменив имя таблицы:

.

using (var bulk = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity & SqlBulkCopyOptions.KeepNulls))
    {
        bulk.BatchSize = 25;
        bulk.DestinationTableName = "Employee";
        bulk.WriteToServer(employeeDataTable);
    }       

Как я могу указать employeeId во второй таблице данных, чтобы он правильно согласовывался с сотрудником, который был вставлен в первый раз? Я читаю данные так, что я читаю сотрудника и адрес вместе, поэтому вставка всех сотрудников, а затем возвращение и вставка всех адресов немного затруднительна.

Мне было интересно, есть ли элегантное решение?


person NibblyPig    schedule 29.08.2013    source источник
comment
Вы используете автоматическую идентификацию стола?   -  person ScottGuymer    schedule 29.08.2013
comment
Да, так нужен идентификатор сотрудника, которому он принадлежит.   -  person NibblyPig    schedule 29.08.2013


Ответы (1)


Я не слишком уверен, насколько это элегантно, думаю, это вам решать. Я предполагаю, что у вас есть уникальное поле или комбинация полей, которые уникальны в данных о сотрудниках.

Если вы создаете промежуточную таблицу на сервере, вы можете массово вставлять данные, которые содержат все данные о сотрудниках, а также информацию об адресах сотрудников.

Из промежуточной таблицы вставьте данные о сотруднике. Затем из промежуточной таблицы присоединитесь к таблице сотрудников (чтобы получить вновь назначенные идентификаторы) и вставьте данные адреса сотрудника.

Наконец, отбросьте промежуточный стол.

Все по-прежнему ориентировано на набор, поэтому у вас должна быть хорошая производительность.

person Gary Walker    schedule 29.08.2013
comment
Я предполагаю, что у каждого сотрудника может быть несколько адресов? вы можете отключить идентификационную вставку и вставить свой собственный идентификатор, сгенерированный последовательно на стороне кода (это разовая вещь или часть производственного запуска системы?) - person ScottGuymer; 29.08.2013
comment
Думаю, я мог бы это сделать, это ранняя стадия того, насколько большим будет проект, но это тоже то, что нужно учитывать. Спасибо. - person NibblyPig; 29.08.2013
comment
Если у вас есть 3 адреса, вы можете денормализовать их в промежуточной таблице, а затем запустить 3 команды, чтобы вставить информацию об адресе. - person Gary Walker; 29.08.2013