Почему я получаю Invalid Cast при использовании Linq to SQL?

Я немного новичок, когда дело доходит до Linq to SQL, но я надеюсь, что вы можете помочь. Я написал следующий оператор Linq to SQL с методами расширения:

Cedb.ClassEvents.Where(c => c.ClassID == 1).Select(c => c).Single()

Где Cedb — это Datacontext, ClassEvents — это таблица (для классов и событий, проводимых на объекте), а ClassID — это уникальный целочисленный ключ.

Этот запрос отлично работает в LinqPad (без Cedb). Когда он возвращается, он говорит, что тип возвращаемого значения — «ClassEvent». В Intellisense в Visual Studio мне сообщается, что возвращаемый тип этого запроса — ClassEvent (создан в моей модели данных). Однако, когда я пытаюсь поместить результаты в переменную:

var classEvent = Cedc.ClassEvents.Where(c.ClassID == 1).Select(c => c).Single();

затем я получаю сообщение об ошибке: InvalidCastException: указанное приведение недействительно. То же самое произойдет, если я использую класс «ClassEvent» вместо var. Я новичок в этом, но это похоже на настоящий слэм-данк, а не на ошибку. Есть ли что-то в методе Single, о котором я не знаю, что приводит к ошибке? Любая помощь будет оценена по достоинству!


person Mark Brittingham    schedule 12.01.2009    source источник


Ответы (2)


Slace - и любые другие заинтересованные стороны. Причиной ошибки «Invalid Cast Exception» было изменение базовой модели данных. Поле smallint было изменено на bit. Таким образом, когда система пыталась сопоставить результаты запроса со структурой данных «ClassEvent», возник конфликт между моделью (которая не обновлялась) и таблицей данных.

Тем не менее, я ценю ответ!

person Mark Brittingham    schedule 12.01.2009
comment
Спасибо за ваш ответ, к сожалению, означает ли это, что мы не можем использовать Linq to SQL для взаимодействия с базой данных, которая может иметь немного другую схему? - person jpierson; 08.06.2012

Вам не нужно делать и Select, и Single, на самом деле вам даже не нужно Where, вы можете обойтись без него (см. http://msdn.microsoft.com/en-us/library/bb535118.aspx):

var classEvent = Cedc.ClassEvents.Single(c => c.ClassID == 1);

Я бы также рекомендовал не использовать Single, если вы не уверены на 100%, что Func<T, bool> всегда будет возвращать значение, как если бы оно не возвращало значение, у вас возникнет исключение. Лучше использовать SingleOrDefault и выполнять нулевую проверку перед взаимодействием с объектом (http://msdn.microsoft.com/en-us/library/bb549274.aspx)

person Aaron Powell    schedule 12.01.2009
comment
Спасибо! Я начал печатать, и если кто-нибудь знает более простой способ... потому что я помню статью 10 Myths, которая объясняла что-то в этом роде. Однако я хотел бы понять, что все делает, а не просто пойти по короткому пути. К счастью, вы сделали и то, и другое. Еще раз спасибо. - person Mark Brittingham; 12.01.2009