У меня есть небольшая проблема с 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, Func1 continuation)preContext, Func
1 продолжение) 1.terminated.
DOH! Я это уже знал! – mhenrixon
Я действительно думал о том, что вчера не был счастлив вообще с мега-транзакциями, которые я запускаю в данный момент. Придется ждать до следующего релиза. :) Спасибо – mhenrixon
Я не виню тебя, у меня слишком много кода, не соблюдающего этот принцип тоже ... – 2010-09-06 21:00:29