【发布时间】:2013-07-03 08:31:35
【问题描述】:
我有两个实体,Arena 和 Regulator,它们之间有多对多的关系。我已经实现了似乎是 EF 代码首先接受的解决方案(见下文)。
我现在坚持实现控制器视图,因此当用户创建一个调节器时,他可以选择一个或多个竞技场(可能带有复选框或多选列表),当他们创建一个竞技场时,一个或多个可以选择监管机构。
有没有办法让 MVC4 为我生成控制器和视图,就像它为一对多关系所做的那样?
编辑:从最初的 cmets 开始,我现在了解到我可以将选定的竞技场添加到调节器对象的 Arenas 导航属性中。我无法找到将选择列表添加到编辑(和创建)视图,然后在控制器中进行更改的方法。谁能举个例子?
EDIT2:如果 EF 确实更新了关系,我有应该工作的编辑操作的代码(regulator.ArenaIDs 是我添加到调节器类的整数列表,用于从 MultiSelectList 中获取所选项目 IDS):
<HttpPost()> _
<ValidateAntiForgeryToken()> _
Function Edit(ByVal regulator As Regulator) As ActionResult
If ModelState.IsValid Then
For Each i In regulator.ArenaIDs
regulator.Arenas.Add(db.Arenas.Find(i))
Next
db.Entry(regulator).State = EntityState.Modified
db.SaveChanges()
Return RedirectToAction("Index")
End If
Return View(regulator)
End Function
我正在使用 VS 2012 和 EF 5.0
这是我的实现:
Public Class Arena
Public Property Id As Integer
Public Property Name As String
Public Overridable Property Regulators() As ICollection(Of Regulator)
End Class
Public Class Regulator
Public Property Id As Integer
Public Property Name As String
Public Overridable Property Arenas() As ICollection(Of Arena)
End Class
使用以下 DbContext
Public Class TslilContext
Inherits DbContext
Public Property Arenas As DbSet(Of Arena)
Public Property Regulators As DbSet(Of Regulator)
Protected Overrides Sub OnModelCreating(ByVal modelBuilder As DbModelBuilder)
modelBuilder.Entity(Of Arena)(). _
HasMany(Function(c) c.Regulators). _
WithMany(Function(p) p.Arenas). _
Map(Function(m)
m.MapLeftKey("ArenaId")
m.MapRightKey("RegulatorId")
m.ToTable("Tiers")
End Function)
End Sub
【问题讨论】:
-
您不需要访问连接表。您有导航属性来读取现有关系并添加新关系。你有 DbSet(s) 来列出现有的实体。不需要更多。对于控制器......你将不得不自己编写它
-
但是连接表将如何更新呢?框架会这样做吗?
-
为什么需要访问中间表?您无法执行哪些操作?
-
@GilShalit EF 将在您添加/更改导航属性时更新连接表。如果您根据这些 cmets 将答案更改为更具体,那么也许我们可以向您展示一个示例。
-
我已编辑问题以反映最初的 cmets。
标签: vb.net entity-framework asp.net-mvc-4