#.net #sql-server #entity-framework #sql-server-2008 #entity-framework-4
#.net #sql-сервер #entity-framework #sql-server-2008 #entity-framework-4
Вопрос:
Я получаю отчет об ошибках из производственной системы. У меня нет простого доступа к производственной системе. Я получу все данные, которые мне нужны для этого в свое время, но то, что я пытаюсь сделать, это ускорить процесс решения этой проблемы. Я пытаюсь исключить как можно больше догадок.
Ошибка, которую я получаю, это:
Расширенные свойства: Исключение — System.Исключение InvalidOperationException: Приведение к значению типа ‘Decimal’ завершилось неудачей, поскольку материализованное значение равно null. Либо общий параметр типа результата, либо запрос должны использовать тип с нулевым значением.
Код, в котором возникает ошибка, выглядит следующим образом:
IQueryable<AccountStatusModel> result = from d in Context.Debtors
where // Condition here
select new AccountStatusModel
{
// All of the below are decimal in the AccountStatusModel
// and all of them are decimal NOT NULL in the database
NotYetDue = d.sometable.dbcurrent,
DueThisMonth = d.sometable.dbprd1bal,
Overdue = d.sometable.dbprd2bal
d.sometable.dbprd3bal
d.sometable.dbprd4bal
d.sometable.dbprd5bal
d.sometable.dbprd6bal,
PaymentRecievedNotAllocated = d.sometable.dbunalloc,
OutstandingOrders = d.dmoutordval ?? 0,
TotalBalance = d.sometable.dbcurrent
d.sometable.dbprd1bal
d.sometable.dbprd2bal
d.sometable.dbprd3bal
d.sometable.dbprd4bal
d.sometable.dbprd5bal
d.sometable.dbprd6bal
d.sometable.dbunalloc
(d.dmoutordval ?? 0),
CreditLimit = d.dmcredlim,
LastPayment = d.dmvallastpaid,
// Some other properties here
// ....
};
Прежде чем кто-либо прокомментирует имена полей, предположите, что это поддельные имена. =)
Обратите внимание, что все запрашиваемые поля базы данных НЕ равны NULL.
Я не могу воспроизвести эту ошибку в среде разработки.
Я думаю, что причина возникновения этой ошибки в PROD заключается в том, что каким-то образом среди запрашиваемых полей одно помечено как NULL. У меня нет быстрого способа проверить это, но в конечном итоге я это сделаю.
Мой вопрос на данный момент таков: может ли быть какая-либо другая причина этой ошибки? Возможно ли получить эту ошибку, если запрос такой, как указано выше, и поля действительно НЕ являются нулевыми значениями. (И почему?) Если это возможно, не могли бы вы, пожалуйста, привести пример, как это сделать.
Пожалуйста, отвечайте, только если вы уверены, что вы правы, т. Е. Мне нужно что-то более сильное, чем «Я думаю, что это так».
Комментарии:
1. «Пожалуйста, отвечайте, только если вы уверены, что вы правы» — не очень хорошая идея. Вы наверняка захотите, чтобы люди предлагали, что попробовать.
2. Выполняется ли у вас многопоточность?
3. @GregC Это веб-приложение
4. @Matt Hamilton: спасибо за ваш вклад, вы действительно правы. Предложения приветствуются!!! Просто я достаточно уверен (исходя из здравого смысла), что я прав, и маловероятно, что есть другая причина для этой ошибки. Я хочу услышать от кого-то, кто еще более уверен, чем я, имеет ли это смысл. Этот вопрос непрактичен, он теоретический, хотя и исходит из практического опыта. Я легко разрешу это практически за несколько дней. Однако я, возможно, никогда не узнаю с точки зрения теории, возможен ли описанный сценарий.
Ответ №1:
Итак, как я и подозревал в своем комментарии к ответу GregC, проблема была в соединении. Схема оказалась правильной. Однако когда-либо запрос, который я процитировал, может возвращать nulls, если в «sometable» нет записи для связанной записи «Debtors». Я в этом случае d.sometable.Все будет равно null. Поскольку L2E объединяет NULL, он не жалуется на то, что d.sometable равен null, просто возвращая null для d.sometable.Что-нибудь вместо этого.
Итак, как и почему.
Комментарии:
1. Изменен тип свойств на
AccountStatusModel
сdecimal
наdecimal?
Ответ №2:
Ваш запрос выглядит хорошо. Ключевым здесь является слово «материализованный», которое подразумевает, что исключение произошло при увлажнении ячейки таблицы с DBNull в ней.
Комментарии:
1. В SQL есть способы получить NULL в столбце, даже если столбец помечен как NOT NULL. Например, когда вы выполняете внешнее объединение, если условие не будет выполнено, вы получите все нули для одной части, независимо от того, что находится в вашей схеме для этих столбцов. В случае моего запроса нет очевидного внешнего соединения или чего-либо еще, что привело бы к получению нулей из базы данных из ненулевых столбцов. Можете ли вы что-нибудь придумать?
2. Вы могли бы привлечь внимание какого-нибудь специалиста по базам данных к этой проблеме с соответствующим тегом в вопросе.