Как использовать Entity Framework для работы с отношениями «многие ко многим»? - PullRequest
1 голос
/ 11 августа 2009

У меня есть SampleDB, которая содержит 3 таблицы.

Table Employees (EmployeeID, EmployeeName)
Table Projects (ProjectID, ProjectName)
Table ProjectResources (ProjectID, EmployeeID)

Таблица ProjectResources является таблицей перекрестных ссылок, которая создает отношение «многие ко многим» между сотрудниками и проектами.

Я хотел бы использовать LINQ для выбора всех сотрудников, которые еще не были назначены для конкретного проекта. Вот шаги, которые я предпринял:

  1. Создана модель данных объекта из SampleDB выше с использованием мастера Entity Framework. Мастер создает две сущности: «Сотрудники» и «Проекты», которые я переименовал в «Сотрудник» и «Проект». Сущность Project имеет свойство навигации Employees, которое ссылается на коллекцию Employees, а сущность Employee имеет свойство навигации Projects, которое ссылается на коллекцию Projects. Таким образом, похоже, что EF правильно определила мои отношения «многие ко многим» между таблицей «Сотрудники» и «Проекты».

  2. Теперь вот код, который я использовал, чтобы попытаться выбрать всех сотрудников, которые еще не были назначены для проекта.

        SampleDBEntities db = new SampleDBEntities();
        var project = db.Projects.Include("Employees")
                                 .FirstOrDefault(p => p.ProjectID == 1);
        var currentEmployees = project.Employees;
        var employeesNotAssignedToProject = 
                db.Employees.Except(currentEmployees);
    

var проект прекрасно загружается с проектом, у которого ProjectID равен 1 var currentEmployees прекрасно загружается со списком сотрудников, назначенных в данный момент этому проекту

Затем я получаю следующее исключение, когда пытаюсь просмотреть представление результатов employeesNotAssignedToProject в окне просмотра:

{"Невозможно создать постоянное значение типа 'System.Collections.Generic.IEnumerable`1'. В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid). "}

Итак, вопросы:

  1. Почему я получаю это исключение?
  2. Есть ли другой способ (который работает) пытаться выполнить задачу такого типа? Обратите внимание, что я пытаюсь использовать метод «Кроме». Возможно, есть лучший способ.

1 Ответ

2 голосов
/ 12 августа 2009

Что по этому поводу:

var employeesNotAssignedToProject = db.Employees.Select(e => e).Where(e => (e.Projects.Count(c => c.ProjectID == 1)) == 0)

Я не проверял это, но в основном он выбирает только тех сотрудников, чья коллекция проектов не включает рассматриваемый проект путем проверки количества проектов с заданным идентификатором.

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