Я пытаюсь получить максимальное значение целочисленного поля в таблице. А именно, я пытаюсь автоматически увеличить поле "InvoiceNumber" при добавлении нового счета. Я не хочу, чтобы это было автоинкрементным полем в базе данных, однако, так как ею управляет пользователь - я просто пытаюсь заботиться о случае по умолчанию. Прямо сейчас я использую
session.CreateCriteria<Invoice>()
.SetProjection(Projections.Max("InvoiceNumber"))
.FutureValue<int>();
получить самый большой номер счета-фактуры уже в базе данных. Это работает отлично, кроме тех случаев, когда нет никаких счетов уже в базе данных. Затем я получаю Систему. ArgumentException: значение "" не имеет типа "Система. Int32" и не может использоваться в этом универсальном наборе. Изменение на FutureValue<int?>()
не решил проблему. Существует ли способ сказать NHibernate отображать пустую строку на пустой указатель? Или есть ли лучший способ выполнить мою цель в целом?
Отслеживание стека исключения (по крайней мере, соответствующая часть)
NHibernate.HibernateException: Error executing multi criteria : [SELECT max(this_.[InvoiceNumber]) as y0_ FROM dbo.[tblInvoice] this_;
SELECT this_.ID as ID647_0_, this_.[NHVersion] as column2_647_0_, this_.[Description] as column3_647_0_, this_.[DiscountPercent] as column4_647_0_, this_.[DiscountDateDays] as column5_647_0_, this_.[PaymentDueDateDays] as column6_647_0_, this_.[Notes] as column7_647_0_, this_.[DiscountDateMonths] as column8_647_0_, this_.[PaymentDueDateMonths] as column9_647_0_, this_.[DiscountDatePeriod] as column10_647_0_, this_.[DiscountDateMonthlyDay] as column11_647_0_, this_.[DiscountDateMonthlyDayDay] as column12_647_0_, this_.[DiscountDateMonthlyDayMonth] as column13_647_0_, this_.[DiscountDateMonthlyThe] as column14_647_0_, this_.[DiscountDateMonthlyTheDOW] as column15_647_0_, this_.[DiscountDateMonthlyTheMonth] as column16_647_0_, this_.[DiscountDateMonthlyTheWeek] as column17_647_0_, this_.[PaymentDueDatePeriod] as column18_647_0_, this_.[PaymentDueDateMonthlyDay] as column19_647_0_, this_.[PaymentDueDateMonthlyDayDay] as column20_647_0_, this_.[PaymentDueDateMonthlyDayMonth] as column21_647_0_, this_.[PaymentDueDateMonthlyThe] as column22_647_0_, this_.[PaymentDueDateMonthlyTheDOW] as column23_647_0_, this_.[PaymentDueDateMonthlyTheMonth] as column24_647_0_, this_.[PaymentDueDateMonthlyTheWeek] as column25_647_0_ FROM dbo.[tblTermsCode] this_;
] ---> System.ArgumentException: The value "" is not of type "System.Int32" and cannot be used in this generic collection.
Parameter name: value
at System.ThrowHelper.ThrowWrongValueTypeArgumentException(Object value, Type targetType)
at System.Collections.Generic.List`1.VerifyValueType(Object value)
at System.Collections.Generic.List`1.System.Collections.IList.Add(Object item)
at NHibernate.Impl.MultiCriteriaImpl.GetResultsFromDatabase(IList results)
use ... .UniqueValue
NH использует неуниверсальный список IList в своей реализации MultiCriteria. Что используется для пакетной обработки FutureValue. см. здесь , чтобы узнать, почему List
не может добавить null через реализацию IList. Я удивлен, что никогда раньше не сталкивался с этим. Избегайте использования типов значений, допускающих значение NULL, с Future или MultiCriteria.