2010-09-01 50 views
1

我刚刚开始学习实体框架4,并对数据透视表如何输入混合有点困惑。案例:我将一个视频游戏评论网站从PHP 5/Kohana框架迁移到ASP.NET MVC 2.我有几个数据透视表来映射我拥有的多对多关系。例如:实体框架4 - 数据透视表和导航属性

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

GamePlatforms

  • GamesPlatformsID - 整型,主键,身份
  • 游戏ID - INT,国外INT,从平台表

我只是有一个很难看到如何将被翻译成EF4导航亲外键 - 从游戏表

  • PlatofrmID关键并且反过来说,我可以写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() 
    

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

    因此,在您的实体模型中,您只需拥有游戏和平台,并且它们之间具有多对多的关系。该查询将如下所示:

     var q = from g in context.GameSet 
           from p in g.Platforms 
           where p.Name == "Xbox 360" 
    
         var count = q.Count();