2009-08-11 6 views
1

J'ai un SampleDB qui contient 3 tables.Comment utiliser Entity Framework pour travailler avec des relations plusieurs-à-plusieurs?

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

La table ProjectResources est une table de références croisées qui crée une relation plusieurs-à-plusieurs entre les employés et les projets.

Je voudrais utiliser LINQ pour sélectionner tous les employés qui n'ont pas encore été affectés à un projet particulier. Voici les étapes de mon travail:

  1. Création d'un modèle de données d'entité de l'SampleDB ci-dessus à l'aide de l'assistant Entity Framework. L'assistant crée deux entités: Employés et Projets, que j'ai renommés être Employé et Projet. L'entité de projet a une propriété de navigation Employees qui référence une collection d'employés et l'entité Employee une propriété de navigation Projects qui référence une collection de projets. Il semble donc que EF a correctement identifié ma relation many-to-many entre les employés et les projets.

  2. Maintenant, voici le code que j'ai utilisé pour essayer de sélectionner tous les employés qui n'ont pas encore été affectés à un projet.

    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); 
    

charges de projet var très bien avec le projet qui a ProjectID de 1 var currentEmployees charges fines avec une liste d'employés actuellement affectés à ce projet

Puis-je obtenir l'exception suivante lorsque je tente pour regarder le ofemployeesNotAssignedToProject de resultsview dans la fenêtre de la montre:

{ "Impossible de créer une valeur constante de type « System.Collections.Generic.IEnumerable`1 ». Seuls les types primitifs ('tels que Int32, String et Guid') sont pris en charge dans ce contexte "}

questions sont donc:.?

  1. Pourquoi ai-je cette exception
  2. ? y at-il une autre façon (qui fonctionne) d'essayer d'accomplir ce type de tâche Remarquez que je suis en train d'utiliser le « Sauf » méthode peut-être il y a une meilleure façon
+0

Désolé pour le formatage de ma question. Je suis nouveau à SO. J'essaierai de formater d'autres questions de manière plus appropriée. – jsteele

+0

J'espère que c'est mieux. :) –

+0

Nice! Merci d'avoir aidé Craig. – jsteele

Répondre

2

Qu'en est-ce:..

Je n'ai pas testé cela, mais fondamentalement, il sélectionne uniquement les employés dont la collection Projects n'inclut pas le projet en question en vérifiant le nombre de projets avec l'ID donné.

+0

Cela fonctionne. Merci. – jsteele

+2

! Any() est plus efficace que Count() == 0, cependant. –

+0

comment cela ressemblerait-il dans l'exemple ci-dessus? –

Questions connexes