2010-09-01 21 views
1

Je commence tout juste à apprendre Entity Framework 4, et je suis un peu confus sur la manière dont les tableaux pivotants entrent dans le mix. Exemple: Je migre un site de révision de jeux vidéo de PHP 5/Kohana vers ASP.NET MVC 2. J'ai quelques tables pivotantes pour mapper les relations plusieurs-à-plusieurs que j'ai. Exemple:Entity Framework 4 - tableaux croisés dynamiques et propriétés de navigation

jeux vidéo peuvent être disponibles pour plusieurs plates-formes (la série Grand Theft Auto, par exemple, est disponible sur XBox 360, Playstation 3, PC, PSP, et même Nintendo DS). Et, naturellement, chaque plate-forme a une bibliothèque de jeux. Donc, j'ai une table nommée GamesPlatforms qui agit comme un pivot entre, ainsi, des jeux et des plates-formes:

GamePlatforms

  • GamesPlatformsID - int, clé primaire, identité
  • gameid - int, étranger clé de la table Jeux
  • PlatofrmID - int, clé étrangère de la table des plates-formes

Je suis juste un moment difficile de voir comment cela se traduit en navigation EF4 pro et, à son tour, comment je pourrais écrire des requêtes LINQ plutôt que des JOINs traditionnelles. Est-ce aussi simple que quelque chose comme:

using(var context = MyEntities();) 
{ 
    var gamePlatformCount = (from gpc in context.Games 
          where gpc.GamesPlatforms.Platforms.Name == "XBox 360" 
          select gpc).Count(); 
} 

?? Fondamentalement, je veux juste savoir si je suis sur la bonne voie, comme aucun des tutoriels que j'ai vu ne traitent des relations plusieurs-à-plusieurs.

Répondre

1

Presque. Vous voulez quelque chose comme:

using(var context = new MyEntities() 
{ 
    var gamePlatformCount = (from gpc in context.Games 
          where gpc.GamesPlatforms.Any(p => p.Platforms.Name == "XBox 360") 
          select gpc).Count(); 
} 
2

Si vous modélisez explicitement le lien entre le jeu et la plate-forme comme une entité, vous pouvez définir votre requête comme ceci:

 var q = from g in context.GameSet 
       from gp in g.GamePlatforms 
       where gp.Platform.Name == "Xbox 360" 
     var count = q.Count() 

Cependant, vous n'avez pas besoin des nombreux table de liens -to-many en tant que partie explicite de votre modèle d'objet. Vous pouvez modéliser directement une relation plusieurs-à-plusieurs dans votre modèle (objet), adossée à la table de liens dans votre base de données. Donc, dans votre modèle Entity, vous auriez simplement Game and Platform, avec une relation plusieurs-à-plusieurs entre eux. La requête ressemblerait alors à quelque chose comme:

 var q = from g in context.GameSet 
       from p in g.Platforms 
       where p.Name == "Xbox 360" 

     var count = q.Count();