【发布时间】:2014-01-04 06:49:31
【问题描述】:
我使用 Code First 和 Entity Framework 5 建立了多对多关系。连接表已创建,但字段数据未保存到数据库中。
工人已成功添加到 Project 对象中,并且 db.SaveChanges() 方法执行没有错误,但是当再次调用 /Project/Edit/x 操作的 GET 请求时,工人列表属性为空。
如何进行这项工作,以便连接的 Worker 数据在通过 POST“保存”后与 GET 请求中的 Project 对象一起保存和检索?
控制器:ProjectController.vb
POST:/Project/Create/x
For i As Integer = LBound(strWorkerIds) To UBound(strWorkerIds)
Dim workerId As Integer
If Integer.TryParse(Trim(strWorkerIds(i)), workerId) Then
Dim worker As Worker = db.Workers.Find(workerId)
If Not worker Is Nothing Then
project.Workers.Add(worker)
End If
End If
Next
If ModelState.IsValid Then
db.Projects.Add(project)
db.SaveChanges() ' The project is saved along with the correct project.Workers list
Return RedirectToAction("Index", "Home")
End If
POST:/Project/Edit/x
For i As Integer = LBound(strWorkerIds) To UBound(strWorkerIds)
Dim workerId As Integer
If Integer.TryParse(Trim(strWorkerIds(i)), workerId) Then
Dim worker As Worker = db.Workers.Find(workerId)
If Not worker Is Nothing Then
project.Workers.Add(worker)
End If
End If
Next
If ModelState.IsValid Then
db.Entry(project).State = EntityState.Modified
db.SaveChanges() 'The changes to project.Workers list are NOT being saved?
Return RedirectToAction("Index", "Home")
End If
模型:Project.vb
Public Class Project
Public Sub New()
Me.Workers = New List(Of Worker)()
End Sub
Public Property ProjectID As Integer
'other properties...
Public Overridable Property Workers As ICollection(Of Worker)
End Class
模型:Worker.vb
Public Class Worker
Public Sub New()
Me.Projects = New List(Of Project)()
End Sub
Public Property WorkerID As Integer
'other properties...
Public Overridable Property Projects As ICollection(Of Project)
End Class
数据库上下文:ProjectLogContext.vb
Imports System.Data.Entity
Imports System.Data.Entity.ModelConfiguration.Conventions
Public Class ProjectLogContext
Inherits DbContext
Public Property Projects As DbSet(Of Project)
Public Property Workers As DbSet(Of Worker)
Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder)
MyBase.OnModelCreating(modelBuilder)
modelBuilder.Conventions.Remove(Of PluralizingTableNameConvention)()
modelBuilder.Entity(Of Worker)().HasMany(Function(w) w.Projects) _
.WithMany(Function(p) p.Workers) _
.Map(Function(x) x.MapLeftKey("WorkerID").MapRightKey("ProjectID") _
.ToTable("WorkerProject"))
End Sub
End Class
【问题讨论】:
-
嗨,欢迎来到 StackOverflow。只是一个建议-您可以在一组较小的代码中复制它吗,例如没有与您的问题不一定相关的 MVC 控制器代码?这里有很多代码,如果我是正确的,这是一个 EF 问题而不是 MVC 问题?
-
感谢@iandotkelly,我已将代码删减以显示重要部分。似乎 EF 不知道 project.Workers 列表已被修改和/或它没有在数据库中更新它。如何让它更新数据库中的 project.Workers 列表?
标签: vb.net asp.net-mvc-4 entity-framework-5