Entity Framework 4 - сводные таблицы и свойства навигации - PullRequest
1 голос
/ 02 сентября 2010

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

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

GamePlatforms

  • GamesPlatformsID - int, первичный ключ, личность
  • GameID - int, внешний ключ из таблицы игр
  • PlatofrmID - int, внешний ключ из таблицы 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();
}

??

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

Ответы [ 2 ]

2 голосов
/ 02 сентября 2010

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

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

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

Таким образом, в вашей модели Entity у вас будут просто игра и платформа сотношения между ними.Тогда запрос будет выглядеть примерно так:

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

        var count = q.Count();
1 голос
/ 02 сентября 2010

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

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();
}
...