实体框架4 - 透视表和导航属性

时间:2010-09-01 20:40:09

标签: linq-to-entities entity-framework-4 pivot-table

我刚刚开始学习实体框架4,并且对于数据透视表如何进入组合感到有些困惑。举个例子:我正在将视频游戏评论网站从PHP 5 / Kohana框架迁移到ASP.NET MVC 2.我有一些数据透视表来映射我拥有的多对多关系。例如:

视频游戏可用于多种平台(例如,侠盗猎车手系列可在XBox 360,Playstation 3,PC,PSP甚至Nintendo DS上使用)。当然,每个平台都有一个游戏库。所以,我有一个名为GamesPlatforms的表,它可以作为游戏和平台之间的支点:

GamePlatforms

  • GamesPlatformsID - int,主键,身份
  • GameID - int,来自Games表的外键
  • 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 个答案:

答案 0 :(得分:2)

如果您明确地将Game和Platform之间的链接建模为实体,则可以像这样定义查询:

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

但是,您不需要多对多链接表作为对象模型的显式部分。您可以直接在(对象)模型中建模多对多关系,并由数据库中的链接表支持。

因此,在您的实体模型中,您只需拥有游戏和平台,它们之间具有多对多的关系。然后查询看起来像:

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

        var count = q.Count();

答案 1 :(得分: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();
}