好的 - 我在数据库中有两个表,员工和公司。以下是每个的基本模式
Table Companies
CompanyID - GUID - PK
CompanyName - NVarChar(100)
Other Descriptive Fields....
Table Employees
EmployeeID - GUID - PK
CompanyID - GUID - FK
Employee Descriptive Fields...
所以现在我有一对多的关系,因为每家公司都可以有多名员工。我还为我的员工类创建了一个 dataRepository,它具有以下功能:
Public Function GetEmployee(ByVal company As String, ByVal id As Guid) As DB.EmpWithComp.employee
Dim emp As DB.EmpWithComp.employee = (From e In db.employees Where e.employeeID = id And e.company.companyName= company Select e).Single
Return emp
End Function
Public Sub save()
db.SubmitChanges()
End Sub
到目前为止一切都很好。当我需要编辑员工时,问题就来了。这是我的控制器功能
<AcceptVerbs(HttpVerbs.Post)> _
Function Edit(ByVal id As Guid, ByVal company As String, ByVal formValues As FormCollection) As ActionResult
Dim e As New DB.EmpWithComp.employee
e = db.GetEmployee(company, id)
Try
UpdateModel(e)
db.save()
Return RedirectToAction("Index")
Catch ex As Exception
Return View(e)
End Try
End Function
Function Edit(ByVal id As Guid, ByVal company As String) As ActionResult
Dim e As New DB.EmpWithComp.employee
e = db.GetEmployee(company, id)
If Not e Is Nothing Then
Return View(e)
Else
Return View("~/Views/Admin/Employees/NotFound.aspx")
End If
End Function
找到了员工,填充了编辑表单,并且发布功能正在按应有的方式触发。但是,我的 updateModel 失败,没有真正的解释。我跟踪了通过 updateModel 的代码,并且所有属性都被分配了正确的值。但是,当 updateModel 到达 LinqToSql 类中的以下部分时,company 的值为 Nothing,这就是导致失败的原因
<Association(Name:="company_employee", Storage:="_company", ThisKey:="companyID", IsForeignKey:=true)> _
Public Property company() As company
Get
Return Me._company.Entity
End Get
Set
Dim previousValue As company = Me._company.Entity
**If ((Object.Equals(previousValue, value) = false) _
OrElse** (Me._company.HasLoadedOrAssignedValue = false)) Then
Me.SendPropertyChanging
If ((previousValue Is Nothing) _
= false) Then
Me._company.Entity = Nothing
previousValue.employees.Remove(Me)
End If
Me._company.Entity = value
If ((value Is Nothing) _
= false) Then
value.employees.Add(Me)
Me._companyID = value.companyID
Else
**Me._companyID = CType(Nothing, System.Guid)**
End If
Me.SendPropertyChanged("company")
End If
End Set
End Property
我在 FK 关系中缺少什么?company 的先前值设置为进入 UpdateModel 的正确值,但未设置当前值。如果我手动设置每个属性(e.firstname = request("firstname") 等)并在 dataRepository 上调用我的保存方法或删除关系并使用 UpdateModel,则一切正常。我宁愿使用 UpdateModel,因为它可以使代码更清晰等。对于冗长的帖子感到抱歉,但这让我发疯了。有任何想法吗?
顺便说一句,我不是要更改 FK,只是简单地更新员工姓名。