2010-09-06 3 views
2

У меня есть небольшая проблема с NHibernate, и я не могу понять, почему. Каждый раз, когда я отлаживаю или профилирую приложение, и я случайно нарушаю уникальное ограничение NHibernate, больше не будет запускаться больше мультивизий (я оставлю след стека исключений до последнего). Это поток. Все в порядке, а затем работает:NHibernate останавливается, если ранее было нарушено уникальное ограничение

Нарушение UNIQUE KEY ограничение 'UQ__workday__572F4CF4753864A1. Невозможно вставить дублирующий ключ в объект 'dbo.workday'. Заявление было завершено .

Описание: Необработанное исключение произошло во время выполнения текущего веб-запроса . Просмотрите трассировку стека для получения дополнительной информации о ошибке и где она возникла в .

Сведения об исключении: System.Data.SqlClient.SqlException: Нарушение UNIQUE KEY ограничение 'UQ__workday__572F4CF4753864A1'. Невозможно вставить дублирующий ключ в объект 'dbo.workday'. Заявление было terminated.terminated.

Если теперь я пытаюсь запустить тот же код, который выполняет запрос:

var query1 = QueryOver.Of<Invoice>() 
    .Fetch(x => x.Company).Eager 
    .Fetch(x => x.Workdays).Eager 
    .Where(x => x.Id == invoiceId); 

var query2 = QueryOver.Of<Invoice>() 
    .Fetch(x => x.Company).Eager 
    .Fetch(x => x.Products).Eager 
    .Where(x => x.Id == invoiceId); 

var result = Session.CreateMultiCriteria() 
    .Add(query1) 
    .Add(query2) 
    .List(); 

var invoice = ((IList) result[0])[0] as Invoice; 

if (invoice != null) { 
    invoice.CalculateTotals(); 
} 

return invoice; 

Этот код генерирует следующее заявление

SELECT this_.invoice_id   as invoice1_10_2_, 
     this_.invoice_number  as invoice2_10_2_, 
     this_.invoice_prefix  as invoice3_10_2_, 
     this_.start_date   as start4_10_2_, 
     this_.end_date   as end5_10_2_, 
     this_.period    as period10_2_, 
     this_.km     as km10_2_, 
     this_.km_price   as km8_10_2_, 
     this_.hour_price   as hour9_10_2_, 
     this_.gst    as gst10_2_, 
     this_.customer_id  as customer11_10_2_, 
     this_.printed   as printed10_2_, 
     this_.created_at   as created13_10_2_, 
     this_.created_by   as created14_10_2_, 
     this_.updated_at   as updated15_10_2_, 
     this_.updated_by   as updated16_10_2_, 
     this_.deleted_at   as deleted17_10_2_, 
     this_.deleted_by   as deleted18_10_2_, 
     this_.company_id   as company19_10_2_, 
     workdays2_.invoice_id as invoice10_4_, 
     workdays2_.workday_id as workday1_4_, 
     workdays2_.workday_id as workday1_15_0_, 
     workdays2_.created_at as created2_15_0_, 
     workdays2_.created_by as created3_15_0_, 
     workdays2_.updated_at as updated4_15_0_, 
     workdays2_.updated_by as updated5_15_0_, 
     workdays2_.quantity  as quantity15_0_, 
     workdays2_.unit_price as unit7_15_0_, 
     workdays2_.day   as day15_0_, 
     workdays2_.description as descript9_15_0_, 
     workdays2_.invoice_id as invoice10_15_0_, 
     company3_.company_id  as company1_12_1_, 
     company3_.created_at  as created2_12_1_, 
     company3_.created_by  as created3_12_1_, 
     company3_.updated_at  as updated4_12_1_, 
     company3_.updated_by  as updated5_12_1_, 
     company3_.name   as name12_1_, 
     company3_.bankgiro_nr as bankgiro7_12_1_, 
     company3_.invoice_prefix as invoice8_12_1_, 
     company3_.moms_reg_nr as moms9_12_1_, 
     company3_.plus_giro_nr as plus10_12_1_, 
     company3_.contact_person as contact11_12_1_, 
     company3_.email   as email12_1_, 
     company3_.mobile   as mobile12_1_, 
     company3_.phone   as phone12_1_, 
     company3_.fax   as fax12_1_ 
FROM [invoice] this_ 
     left outer join [workday] workdays2_ 
     on this_.invoice_id = workdays2_.invoice_id 
     left outer join [company] company3_ 
     on this_.company_id = company3_.company_id 
WHERE this_.invoice_id = 351 /* @p0 */ 
SELECT this_.invoice_id   as invoice1_10_2_, 
     this_.invoice_number  as invoice2_10_2_, 
     this_.invoice_prefix  as invoice3_10_2_, 
     this_.start_date   as start4_10_2_, 
     this_.end_date   as end5_10_2_, 
     this_.period    as period10_2_, 
     this_.km     as km10_2_, 
     this_.km_price   as km8_10_2_, 
     this_.hour_price   as hour9_10_2_, 
     this_.gst    as gst10_2_, 
     this_.customer_id  as customer11_10_2_, 
     this_.printed   as printed10_2_, 
     this_.created_at   as created13_10_2_, 
     this_.created_by   as created14_10_2_, 
     this_.updated_at   as updated15_10_2_, 
     this_.updated_by   as updated16_10_2_, 
     this_.deleted_at   as deleted17_10_2_, 
     this_.deleted_by   as deleted18_10_2_, 
     this_.company_id   as company19_10_2_, 
     products2_.invoice_id as invoice10_4_, 
     products2_.product_id as product1_4_, 
     products2_.product_id as product1_13_0_, 
     products2_.created_at as created2_13_0_, 
     products2_.created_by as created3_13_0_, 
     products2_.updated_at as updated4_13_0_, 
     products2_.updated_by as updated5_13_0_, 
     products2_.quantity  as quantity13_0_, 
     products2_.profit_rate as profit7_13_0_, 
     products2_.unit_price as unit8_13_0_, 
     products2_.description as descript9_13_0_, 
     products2_.invoice_id as invoice10_13_0_, 
     company3_.company_id  as company1_12_1_, 
     company3_.created_at  as created2_12_1_, 
     company3_.created_by  as created3_12_1_, 
     company3_.updated_at  as updated4_12_1_, 
     company3_.updated_by  as updated5_12_1_, 
     company3_.name   as name12_1_, 
     company3_.bankgiro_nr as bankgiro7_12_1_, 
     company3_.invoice_prefix as invoice8_12_1_, 
     company3_.moms_reg_nr as moms9_12_1_, 
     company3_.plus_giro_nr as plus10_12_1_, 
     company3_.contact_person as contact11_12_1_, 
     company3_.email   as email12_1_, 
     company3_.mobile   as mobile12_1_, 
     company3_.phone   as phone12_1_, 
     company3_.fax   as fax12_1_ 
FROM [invoice] this_ 
     left outer join [product] products2_ 
     on this_.invoice_id = products2_.invoice_id 
     left outer join [company] company3_ 
     on this_.company_id = company3_.company_id 
WHERE this_.invoice_id = 351 /* @p1 */ 

я получаю действительно расстраивает исключение. Фактически с этого момента каждый запрос представляет собой тайм-аут, и приложение нужно перезапустить, прежде чем я смогу выполнить что-либо. Иногда это даже не помогает перезапустить его.

Кто-нибудь знает, что с этим связано?

на System.Data.SqlClient.SqlConnection.OnError (SqlException исключения, булева breakConnection)
на System.Data.SqlClient.SqlInternalConnection.OnError (SqlException исключения, булева breakConnection)
в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() на System.Data.SqlClient.TdsParser.Run (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader DATASTREAM, Насыпная CopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) при System.Data.SqlClient.SqlDataReader.ConsumeMetaData() на System.Data.SqlClient.SqlDataReader.get_MetaData() на System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader DS, RunBehavior runBehavior, Строка resetOptionsString) при System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, Логического returnStream, булева асинхронный)
на System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Логическое returnStream, String метод, результат DbAsyncResult) при System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Логическое returnStream, метод String)
в System.Data.SqlClient.SqlCommand.ExecuteReader (CommandBehavior поведение, метод String) в System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (CommandBehavior поведение) при System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader() по адресу NH ibernate.AdoNet.AbstractBatcher.ExecuteReader (IDbCommand CMD) в D: \ CSharp \ NH \ NHibernate \ SRC \ NHibernate \ AdoNet \ AbstractBatcher.cs: линия 247 на NHibernate.Impl.MultiCriteriaImpl.GetResultsFromDatabase (IList результатов) в D: \ CSharp \ NH \ NHibernate \ SRC \ NHibernate \ Impl \ MultiCriteriaImpl.cs: линия 209 на NHibernate.Impl.MultiCriteriaImpl.DoList() в D: \ CSharp \ NH \ NHibernate \ SRC \ NHibernate \ Impl \ MultiCriteriaImpl.cs: линия 171 на NHibernate.Impl.MultiCriteriaImpl.ListIgnoreQueryCache() в D: \ CSharp \ NH \ NHibernate \ SRC \ NHibernate \ Impl \ MultiCriteriaImpl.cs: линияна NHibernate.Impl.MultiCriteriaImpl.List() в д: \ CSharp \ NH \ NHibernate \ SRC \ NHibernate \ Impl \ MultiCriteriaImpl.cs: линия 91 на FakturaLight.Repositories.InvoiceRepository.GetSingle (Int32 InvoiceID) в D: \ Projekt \ faktura_light \ SRC \ FakturaLight \ Хранилища \ InvoiceRepository.cs: линия 168 на FakturaLight.WebClient.Controllers.InvoiceController.PrepareEditInvoiceModel (EditInvoiceModel oldModel, Int32 Id) в D: \ \ Projekt faktura_light \ src \ FakturaLight.WebClient \ Controllers \ InvoiceController.cs: строка 116 на FakturaLight.WebClient.Controllers.InvoiceController.E DIT (Int32 идентификатор) в D: \ Projekt \ faktura_light \ SRC \ FakturaLight.WebClient \ Контроллеры \ InvoiceController.cs: линия 82 на lambda_method (закрытие, ControllerBase, Object []) при System.Web.Mvc. ActionMethodDispatcher.Execute (ControllerBase контроллер, Object []) параметры при System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary параметров) на System.Web.Mvc.ControllerActionInvoker. <> c__DisplayClassd.b__a() на System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter (IActionFilter фильтра, ActionExecutingContext preContext, Func 1 continuation)preContext, Func 1 продолжение) 1.terminated.

ответ

5

Это по дизайну. Просто создайте еще один сеанс.

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

(пожалуйста, помните, что ваши занятия должны быть открыты поздно и закрыты рано)

+0

DOH! Я это уже знал! – mhenrixon

+0

Я действительно думал о том, что вчера не был счастлив вообще с мега-транзакциями, которые я запускаю в данный момент. Придется ждать до следующего релиза. :) Спасибо – mhenrixon

+0

Я не виню тебя, у меня слишком много кода, не соблюдающего этот принцип тоже ... – 2010-09-06 21:00:29

Смежные вопросы