Использование транзакции NHibernate в SqlBulkCopy

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

using (ISession session = NHibernateHelper.OpenSession()) using (ITransaction transaction = session.BeginTransaction()) { session.SaveOrUpdate(something); // ... SqlBulkCopy bulkCopy = new SqlBulkCopy( (SqlConnection)session.Connection, SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.FireTriggers, ???transaction??? ); //... transaction.Commit(); } 

Я знаю, что могу использовать TransactionScope или делать это иначе. Но я настаиваю на этом. Давайте сделаем вид, что ради независимого доступа БД (если я извлекаю и вставляю произвольную операцию массовой вставки). Есть ли способ получить экземпляр SqlTransaction из NHibernate.ITransaction ?

благодаря

Неудивительно, что Айенде тоже занялся этим , но это довольно шумно.

Суть в том, что вы знаете, что вы можете заручиться нормальными экземплярами IDbCommand ADO.NET в транзакции NHibernate, например:

 var cmd = new SqlCommand (); if (session.Transaction != null && session.Transaction.IsActive) session.Transaction.Enlist (cmd); 

Но SqlBulkCopy не является IDbCommand , и этот конкретный конструктор требует SqlTransaction (так что вы уже пропустили лодку на независимость провайдера). Итак, чит – ваш пример может выглядеть примерно так:

 using (var session = NHibernateHelper.OpenSession ()) using (var transaction = session.BeginTransaction ()) { using (var cmd = new SqlCommand ()) { transaction.Enlist (cmd); var bulk = new SqlBulkCopy ((SqlConnection)session.Connection, SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.FireTriggers, (SqlTransaction)cmd.Transaction); } // ... transaction.Commit (); } 

Вы, несомненно, захотите проверить ошибки, безопасные отпечатки и т. Д. Я не знаю более современного / менее страшного способа сделать это, к сожалению (даже для получения IDbTransaction из ITransaction ).

Проверьте это сообщение от Ayene:
http://ayende.com/Blog/archive/2009/08/22/nhibernate-perf-tricks.aspx

Он показывает, как вы можете это сделать, используя оба варианта: NHibernate StatelessSession или SqlBulkCopy. Он показывает пример кода следующим образом:

  var dt = new DataTable("Users"); dt.Columns.Add(new DataColumn("Id", typeof(int))); dt.Columns.Add(new DataColumn("Password", typeof(byte[]))); dt.Columns.Add(new DataColumn("Username")); dt.Columns.Add(new DataColumn("Email")); dt.Columns.Add(new DataColumn("CreatedAt", typeof(DateTime))); dt.Columns.Add(new DataColumn("Bio")); for (int i = 0; i < count; i++) { var row = dt.NewRow(); row["Id"] = i; row["Password"] = Guid.NewGuid().ToByteArray(); row["Username"] ="User " + i; row["Email"] = i + "@example.org"; row["CreatedAt"] =DateTime.Now; row["Bio"] = new string('*', 128); dt.Rows.Add(row); } using (var connection = ((ISessionFactoryImplementor)sessionFactory).ConnectionProvider.GetConnection()) { var s = (SqlConnection)connection; var copy = new SqlBulkCopy(s); copy.BulkCopyTimeout = 10000; copy.DestinationTableName = "Users"; foreach (DataColumn column in dt.Columns) { copy.ColumnMappings.Add(column.ColumnName, column.ColumnName); } copy.WriteToServer(dt); } 
  • Автоматическая повторная попытка неудачного подключения в NHibernate
  • Атомная «вставка, если не существует» с NHibernate
  • Как индексировать внешние ключи с помощью Fluent NHibernate и SchemaUpdate.Execute ()?
  • NHibernate - необходимо изменить порядок сохранения, чтобы удовлетворить ограничения базы данных?
  • sql server datetime
  • «Не удалось выполнить ошибку запроса» в веб-службах с NHibernate
  • NHibernate выберите верхний N с условием для детей с использованием выборки
  • SQL Server Read Uncommitted - блокирование транзакций
  • Улучшение SQL-запросов - выберите с max и groupby
  • Аудит данных в NHibernate и SqlServer
  • Сохраненные процедуры для удаления с помощью свободного nHibernate
  • Interesting Posts

    Обновление базы данных во время установки

    SQL: Как показать столбец таблицы как строку?

    Оптимизация запросов MSSQL

    Многоуровневая схема с SQLServer и Hibernate

    Как использовать локальные переменные в хранимых процедурах?

    EF Seed не работает, когда данные уже находятся в базе данных

    Комплексный дизайн SQL, помощь / рекомендации

    Справка по запросу SQL SERVER (с помощью курсора?)

    SQL Server: обновлять записи в динамически создаваемых таблицах с использованием параметров хранимой процедуры

    как вставлять вычитание из двух последующих строк и вставлять их в новый столбец

    Как правильно использовать оператор Case в предложении T-SQL по условию?

    получить результат от хранимой процедуры

    ASP.NET TextBox ограничивает ввод / вывод примерно 500 символами

    Удалите один символ из строки за раз справа, пока не будет найдено совпадение

    Заменить шаблон для отдельных символов

    Давайте будем гением компьютера.