OK - データベースに従業員と会社の 2 つのテーブルがあります。それぞれの基本的なスキーマは次のとおりです。
Table Companies
CompanyID - GUID - PK
CompanyName - NVarChar(100)
Other Descriptive Fields....
Table Employees
EmployeeID - GUID - PK
CompanyID - GUID - FK
Employee Descriptive Fields...
そのため、各企業には複数の従業員がいる可能性があるため、1対多の関係があります。次の関数を使用して、従業員クラスの 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 関係で欠けているものは何ですか? 会社の以前の値は、UpdateModel に入る正しい値に設定されていますが、現在の値は設定されていません。各プロパティ (e.firstname = request("firstname") など) を手動で設定し、dataRepository で save メソッドを呼び出すか、関係を削除して UpdateModel を使用すると、すべてが正常に機能します。コードがきれいになるなどの理由で、むしろ UpdateModel を使用したいと思います。何か案は?
ところで、私は FK を変更しようとしているのではなく、単に従業員名を更新するだけです。