Arena と Regulator という 2 つのエンティティがあり、それらの間には多対多の関係があります。EFコードで最初に受け入れられたソリューションと思われるものを実装しました(以下を参照)。
ユーザーがレギュレーターを作成するときに、1 つまたは複数のアリーナ (おそらくチェック ボックスまたは複数選択リストを使用) を選択できるように、コントローラー ビューの実装に行き詰まっています。また、アリーナを作成するときに、1 つまたは複数のレギュレーターを選択されました。
1 対多の関係の場合のように、MVC4 がコントローラーとビューを生成する方法はありますか?
編集: 最初のコメントから、選択したアリーナをレギュレーター オブジェクトの Arenas ナビゲーション プロパティに追加できることがわかりました。選択リストを編集 (および作成) ビューに追加し、コントローラーで変更を加える方法を見つけることができませんでした。誰でも例を提供できますか?
EDIT2: EF が実際にリレーションシップを更新した場合に機能する Edit アクションのコードがあります (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