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

Linq to entities 实体框架4-透视表和导航属性,linq-to-entities,entity-framework-4,pivot-table,Linq To Entities,Entity Framework 4,Pivot Table,我刚刚开始学习EntityFramework4,对pivot表如何进入混合有点困惑。举个例子:我正在将一个视频游戏评论网站从PHP5/Kohana框架迁移到ASP.NETMVC2。我有几个数据透视表来映射我拥有的多对多关系。例如: 视频游戏可以在多个平台上使用(例如,侠盗猎车手系列可以在XBox 360、Playstation 3、PC、PSP甚至任天堂DS上使用)。当然,每个平台都有一个游戏库。因此,我有一个名为GamesPlatforms的表,它充当游戏和平台之间的轴心: 游戏平台 Gam

我刚刚开始学习EntityFramework4,对pivot表如何进入混合有点困惑。举个例子:我正在将一个视频游戏评论网站从PHP5/Kohana框架迁移到ASP.NETMVC2。我有几个数据透视表来映射我拥有的多对多关系。例如:

视频游戏可以在多个平台上使用(例如,侠盗猎车手系列可以在XBox 360、Playstation 3、PC、PSP甚至任天堂DS上使用)。当然,每个平台都有一个游戏库。因此,我有一个名为GamesPlatforms的表,它充当游戏和平台之间的轴心:

游戏平台

  • GamesPlatformsID--int,主键,标识
  • GameID——int,来自Games表的外键
  • PlatofrmID--int,平台表中的外键
我很难理解如何将其转换为EF4导航属性,以及如何编写LINQ查询而不是传统的连接。它是否像这样简单:

using(var context = MyEntities();)
{
    var gamePlatformCount = (from gpc in context.Games
                            where gpc.GamesPlatforms.Platforms.Name == "XBox 360"
                            select gpc).Count();
}
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();
}
        var q = from g in context.GameSet
                from p in g.Platforms
                where p.Name == "Xbox 360"

        var count = q.Count();
?


基本上,我只是想知道我是否走上了正确的道路,因为我看过的教程都没有涉及多对多关系。

几乎没有。你想要的是:

using(var context = MyEntities();)
{
    var gamePlatformCount = (from gpc in context.Games
                            where gpc.GamesPlatforms.Platforms.Name == "XBox 360"
                            select gpc).Count();
}
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();
}
        var q = from g in context.GameSet
                from p in g.Platforms
                where p.Name == "Xbox 360"

        var count = q.Count();

如果将游戏和平台之间的链接显式建模为一个实体,则可以如下定义查询:

        var q = from g in context.GameSet
                from gp in g.GamePlatforms
                where gp.Platform.Name == "Xbox 360"
        var count = q.Count()
但是,您不需要将多对多链接表作为对象模型的显式部分。您可以直接在(对象)模型中建模多对多关系,该模型由数据库中的链接表支持

所以在你的实体模型中,你只需要游戏和平台,它们之间有多对多的关系。然后,查询将类似于:

using(var context = MyEntities();)
{
    var gamePlatformCount = (from gpc in context.Games
                            where gpc.GamesPlatforms.Platforms.Name == "XBox 360"
                            select gpc).Count();
}
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();
}
        var q = from g in context.GameSet
                from p in g.Platforms
                where p.Name == "Xbox 360"

        var count = q.Count();