我如何在实体框架中实现类似Rails:has_many:through?

时间:2014-05-07 20:59:51

标签: entity-framework-6

我的应用程序有“Mainlines”,其中包含许多“Builds”,而“Builds”又有许多“Releases”。在VB.NET中(不允许使用C#):

Partial Public Class Mainline
    Public Property MainlineID As Integer
    Public Property Designation As String
    ...
    Public Overridable Property Builds As ICollection(Of Build)
End Class

Partial Public Class Build
    Public Property BuildID As Integer
    Public Property Version As String
    ...
    Public Overridable Property Mainline As Mainline
    Public Overridable Property Releases As ICollection(Of Release)
End Class

Partial Public Class Release
    Public Property ReleaseID As Integer
    Public Property Version As Integer
    Public Property ReleaseDate As Date
    ...
    Public Overridable Property Build As Build
End Class

我多年来一直在做Rails,所以这是我所知道的谈论我想要的术语,但我需要在Mainlines上:has_many :through才能通过Builds获得Releases。我想知道如何使用这种语法:

db.Mainlines.Find(4).Releases

就SQL而言,我想做的是:

SELECT rels.*
FROM dbo.Releases rels,
dbo.Mainlines mls,
dbo.Builds blds
WHERE mls.MainlineID = blds.Mainline_MainlineID
AND blds.BuildID = rels.Build_BuildID
AND mls.MainlineID = 4
ORDER BY rels.ReleaseDate ASC

具体来说,我试图在“Mainline”(可能有不同的“Build”)上查找所有“Releases”,以便我可以跟踪一段时间内发生变化的事情(在版本的子模型中) 。 (对于像Rails的acts_like_tree gem而言,拥有一个用于EF的NuGet包会很不错,但按照最新的上一个日期进行跟踪会让我足够接近。)

似乎应该可以在类定义或OnModelCreating类的DbContext部分中执行某些操作,但我无法在任何地方找到任何内容,看起来像我正在尝试做的一个例子。它看起来很基本,我很确定我只是错过它。

MSDN上有一堆代码显示了我认为EF自动执行的内容的Fluent API示例,这令人困惑。 (这让我认为这些文档适用于EF4。)如果您遵循该示例,我想:

SchoolEntities.Departments.First.Instructors

1 个答案:

答案 0 :(得分:2)

以下应该工作(虽然我没试过)

db.Mainlines
    .Where(Function(m) m.MainlineID = 4)
    .SelectMany(Function(m) m.Builds.SelectMany(Function(b) b.Releases))
.ToList()

最初,我在C#中写了这个,所以给出了相同的参考:

db.Mainlines
    .Where(m => m.MainlineID == 4)
    .SelectMany(m => m.Builds.SelectMany(b => b.Releases))
.ToList();