Entity Framework 4 - 数据透视表和导航属性

Posted

技术标签:

【中文标题】Entity Framework 4 - 数据透视表和导航属性【英文标题】:Entity Framework 4 - pivot tables and navigation properties 【发布时间】:2010-09-01 20:40:08 【问题描述】:

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

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

游戏平台

GamesPlatformsID -- int、主键、身份 GameID -- 整数,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();

??

基本上,我只是想知道我是否走在正确的轨道上,因为我见过的教程都没有处理多对多关系。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

几乎。你想要这样的东西:

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

【讨论】:

以上是关于Entity Framework 4 - 数据透视表和导航属性的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework Core 数据保存原理详解

.Net Framework 4.5.2 和 Entity Framework 6 中的两种不同的数据库访问

Entity Framework 4 的数据库迁移

Entity Framework 4.3 多应用数据库迁移策略

在 Entity Framework 4.3 中增量播种数据的最佳方法

一文学会使用Entity Framework Core