2009-07-01 26 views
1

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を変更しようとしていません。従業員の名前を更新するだけです。

答えて

4

あなたのビューはどのように見えますか?

このような?

もしそうなら、UpdateModelは文字列ではなくオブジェクトであるe.Companyに文字列( "Company")を書き込むよう試みます。

あなたが本当に変更したいのは、Employee.CompanyIDです。新しいIDで隠し入力を使用するか、独自のModelBinderを書くことができるCompanyNameでCompanyIDを探したい場合にこれを行うことができます。


EDIT

あああなたは、会社を更新したいイベントをいけない私のせいにSRY。あなたはこの

Dim exclude() As String = {"company"} 
UpdateModel(e, String.Empty, Nothing, exclude) 

または私は何を好むように除外プロパティとして、会社を設定することによってこれを行うことができ、あなたのPOSTで

Function Edit(ByVal id As Guid, ByVal company As String... 

存在している会社を無視するのUpdateModelを指示する必要があり、その場合で 、あなたはこの

<%=Html.Textbox("Employee.Firstname", ViewData.Model.Firstname)>% 

のようなあなたのフィールドの前に追加の使用を開始し、この

0のようなのUpdateModel呼び出すことができます
UpdateModel(e, "Employee") 

HTH

+0

いや、私の見解では、単に従業員のデータ項目(姓、名、など)です。これらの2つのテーブルの関係は、特定の会社の従業員のリストを提供できるようにすることです。ビューはデータと正しくバインドされますが、モデルの更新時には消えます。 UpdateModelは、従業員レコードのFK制約を含む企業の資格とは何も更新していないにもかかわらず、フォームから戻ってくる企業エンティティがないという不安を抱いているようです。 – Tommy

+0

今、私はあなたの問題を理解して、私は私の答えを更新しました。 –

+0

ありがとう、それは完璧に動作します!遅く応答して申し訳ありませんが、この週末はコーディングしていません。 – Tommy