Ok - データベース、従業員、企業に2つのテーブルがあります。ここでは、各ASP.NET MVC、LINQ、UpdateModelの問題
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クラスの以下のセクションを取得するときしかし、会社の価値は何もあり、これは失敗
<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を変更しようとしていません。従業員の名前を更新するだけです。
いや、私の見解では、単に従業員のデータ項目(姓、名、など)です。これらの2つのテーブルの関係は、特定の会社の従業員のリストを提供できるようにすることです。ビューはデータと正しくバインドされますが、モデルの更新時には消えます。 UpdateModelは、従業員レコードのFK制約を含む企業の資格とは何も更新していないにもかかわらず、フォームから戻ってくる企業エンティティがないという不安を抱いているようです。 – Tommy
今、私はあなたの問題を理解して、私は私の答えを更新しました。 –
ありがとう、それは完璧に動作します!遅く応答して申し訳ありませんが、この週末はコーディングしていません。 – Tommy