Проблема с Linq to SQL - PullRequest
1 голос
/ 26 ноября 2010

Я работаю с Linq to SQL уже некоторое время, и у меня никогда не было проблем ... до сих пор. У меня есть метод, который отправляет запрос в базу данных, но в отличие от других случаев, когда я это делал, я не могу привести результат (будь то в List или Array). Метод выглядит следующим образом:

public List<vwContainer> GetConteinerPorto(int id)
{
    return (from cont in db.vwContainers
            where cont.idHarbor == id
            orderby cont.Year
            select cont).ToList();
}

Я пробовал некоторые варианты этого, но это всегда приводило к «Указанное приведение неверно». исключение выбрасывается. Ребята, вы можете дать мне немного света?

StackTrace:

[InvalidCastException: Specified cast is not valid.]
   System.Data.SqlClient.SqlBuffer.get_Int32() +6271252
   Read_vwCargas_movimentadas_conteiner(ObjectMaterializer`1 ) +636
   System.Data.Linq.SqlClient.ObjectReader`2.MoveNext() +42
   System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +472
   System.Linq.Enumerable.ToList(IEnumerable`1 source) +80
   WebPortosSEP.Web.Models.PortoRepository.GetConteinerPorto(Int32 id) +867
   WebPortosSEP.Web.Controllers.PortoController.Cargas(Int32 id) +255
   lambda_method(Closure , ControllerBase , Object[] ) +112
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +258
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +39
   System.Web.Mvc.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a() +125
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +640
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +312
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +709
   System.Web.Mvc.Controller.ExecuteCore() +162
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__4() +58
   System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +20
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +453
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +371

Ответы [ 6 ]

4 голосов
/ 26 ноября 2010

Это может быть из-за несоответствия между типами столбцов в базе данных и типами .Net.

Когда значения полей типа cont.idHarbor и cont.Year считываются из базы данных и преобразуются в типы .Net, результирующие типы могут не соответствовать свойствам вашего класса.

Проверьте, является ли idHarbor значительным в базе данных, и сравниваете ли вы его с int. Также проверьте типы полей Год. Вы можете взять ключ от трассировки стека. Исключение выдается SqlDataReader.GetInt64 или любым другим подобным методом?

2 голосов
/ 26 ноября 2010

Казалось бы, cont на самом деле не vwContainer.

0 голосов
/ 26 ноября 2010

Если это исключение во время выполнения, а не ошибка компиляции, то проблема почти наверняка в том, что ваш dbml-файл не синхронизирован с вашей базой данных на каком-то уровне.У меня также возникают похожие проблемы, когда у вас есть несколько файлов dbml в одном и том же пространстве имен.

Попробуйте удалить соответствующую таблицу из файла dbml и воссоздать ее.

ОБНОВЛЕНИЕ:

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

Также обратите внимание, что ваша трассировка стека включает в себя следующее:

Read_vwCargas_movimentadas_conteiner

Это отличается от кода, который вы опубликовали.

Обновление 2:

Исключение происходит при преобразовании Int32, которое предполагает, что один из ваших столбцов данных не определен правильно.Вы изменили тип с nullable на non-nullable?

0 голосов
/ 26 ноября 2010

Возможно, вы изменили схему базы данных (например, в строку) и не обновили DBML (вы увидите эту ошибку только во время выполнения при первом обращении к таблице с ошибкой)

0 голосов
/ 26 ноября 2010

Попробуйте это:

 public List<vwContainer> GetConteinerPorto(int id) 
 { 
    return (from cont in db.vwContainers 
           where cont.idHarbor == id 
           orderby cont.Year 
           select cont).ToList<vwContainer>(); 
 } 
0 голосов
/ 26 ноября 2010

Ваш метод не содержит приведений. Вы уверены, что Исключение выдается из метода, а не из его сайта вызова?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...