Я удалил из этого вопроса значительное количество текста, потому что я считаю, что нужно быть более кратким. - SergИсключение, возникающее при использовании запроса Linq с платформой Entity Framework
Вот что я пытаюсь сделать. Пользователь выбирает состояние, затем ComboBox загружается с Городами в этом состоянии, а затем, когда пользователь выбирает «Город», ListBox загружает все проекты из этого Города.
При выполнении метода, который, как предполагается, чтобы загрузить проекты в ComboBox, я получаю эту ошибку:
Exception has been thrown by the target of an invocation. Inner Exception is: "{"Specified cast is not valid."}"valid."}"
Это метод, который вызывает исключение:
private void LoadProjectsToListBox(long idCity)
{
ProjectRepository projectRepo = new ProjectRepository();
//This line causes the error.
var projects = projectRepo.FindAllProjects().Where(c => c.IDCity == 1).ToList();
}
В запросе Linq , вы увидите, что я сравниваю с жестким кодированным номером. 1, является действительным идентификатором города, в котором есть проекты, поэтому он должен работать. Исключение возникает только тогда, когда я даю Linq запросу идентификатор города, в котором есть проекты. Таким образом, кажется, что ошибка возникает, когда запрос возвращает результаты.
Вот операторы SQL, которые я использовал для создания проекта и городов столы:
create table City
(
ID integer primary key autoincrement,
Name string,
IDState integer references State(ID)
);
create table Project
(
ID integer primary key autoincrement,
Name string,
StartDate text,
IDManager integer references Manager(ID),
IDCity integer references City(ID),
IDDepartment integer references Department(ID),
ContactNumber string,
Description string
);
Что мне кажется странным, что с помощью точно такой же модели и кодом доступа, чтобы показать список отделов (просто другая таблица в моей базе данных) все работает так, как ожидалось. Например, вот как я загружаю Департаменты прямо сейчас только для тестирования:
private void LoadProjectsToListBox(long idCity)
{
ProjectRepository projectRepo = new ProjectRepository();
DepartmentRepository departmentRepo = new DepartmentRepository();
//Doesn't work - raises exception.
var projects = projectRepo.FindAllProjects().Where(c => c.IDCity == 1).ToList();
//Works exactly as expected.
var deps = departmentRepo.FindAllDepartments().Where(c => c.IDParentDepartment == 7).ToList();
lstProjects.Items.Clear();
foreach (var item in deps)
{
lstProjects.Items.Add(item.Name);
}
}
Edit:
В FindAllDepartments(), FindAllCities(), FindAllProjects() методы, по существу, то же самое.
DocumentsDBEntities db = new DocumentsDBEntities();
public IQueryable<Project> FindAllProjects()
{
return db.Projects;
}
public IQueryable<City> FindAllCities()
{
return db.Cities;
}
public IQueryable<Department> FindAllDepartments()
{
return db.Departments;
}
Как уже упоминалось ранее, Департамент получает работы; Исключение проекта вызывает исключение.
Edit 3:
Я установил ее! Проблема заключалась в использовании типа данных «Текст» в таблице Project. Если я изменил тип данных из этого столбца с «Текст» на «Строка», он работает безупречно. Может ли кто-нибудь сказать мне, почему?
Спасибо за трассировку стека. Вы упомянули внутреннее исключение, можете ли вы предоставить трассировку стека для этого? –
В той части, которая работает, вы добавляете только строку (project.Name)? В том, что не работает (если я правильно понял вопрос), кажется, что источник данных подключен к списку объектов, и ошибка звучит так, как будто он не смог найти подходящие значения для указанных объектов. Я считаю, что наблюдаемое поведение может быть красно-селедочным. Счастливое кодирование. – 2010-11-02 00:25:03
Если я просто использую эту строку, у меня все еще есть ошибка: var x = projectRepo.FindAllProjects(). Где (l => l.IDCity == idCity) .ToList(); – 2010-11-02 00:27:11