2010-09-01 2 views
1

Я только начинаю изучать Entity Framework 4 и немного смущен тем, как сводные таблицы входят в микс. Пример: я переношу сайт обзора видеоигр с PHP 5/Kohana framework на ASP.NET MVC 2. У меня есть несколько сводных таблиц для сопоставления отношений «многие ко многим», которые у меня есть. Пример:Entity Framework 4 - сводные таблицы и навигационные свойства

Видео игры могут быть доступны для нескольких платформ (например, серия Grand Theft Auto доступна на XBox 360, Playstation 3, ПК, PSP и даже Nintendo DS). И, естественно, на каждой платформе есть библиотека игр. Итак, у меня есть таблица с именем GamesPlatforms, который действует как стержень между ними, а, игр и платформ:

GamePlatforms

  • GamesPlatformsID - INT, первичный ключ удостоверения
  • GameID - ИНТ, иностранные ключ от игр таблицы
  • PlatofrmID - междунар, внешний ключ из таблицы Platforms

Я просто с трудом, видя, как это будет переведено в EF4 навигации про и, в свою очередь, как я мог писать запросы LINQ, а не традиционные JOIN. Это так просто, как что-то вроде:

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

??

В принципе, я просто хочу знать, нахожусь ли я на правильном пути, поскольку ни один из обучающих программ, которые я видел, не имеет отношения к отношениям «многие ко многим».

ответ

1

Практически. Вы хотите что-то вроде:

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

Если вы явно моделировать связь между игрой и платформами, как юридическое лицо, Вы можете определить свой запрос так:

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

Однако, вам не нужны многие -to-many, как явная часть вашей объектной модели. Вы можете напрямую моделировать отношение «много-ко-многим» в вашей (объектной) модели, поддерживаемое таблицей ссылок в вашей базе данных.

Итак, в вашей модели Entity вы бы просто имели Game and Platform, со многими отношениями между ними. Запрос будет выглядеть примерно так:

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

     var count = q.Count(); 
Смежные вопросы