1

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 を変更しようとしているのではなく、単に従業員名を更新するだけです。

4

1 に答える 1

4

あなたの見方はどのように見えますか?

このような?

はいの場合、UpdateModel は request("Company") の文字列を、文字列ではなくオブジェクトである e.Company に書き込もうとします。

本当に変更したいのは Employee.CompanyID ですよね? 新しい ID で Hidden Input を使用するか、CompanyName で CompanyID を見つけたい場合は、独自の ModelBinder を記述してこれを行うことができます。


編集

ああ、あなたは会社を更新したくないのですが、私のせいです。その場合、POST に存在する会社を無視するように UpdateModel に指示する必要があります。

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

このように会社を除外プロパティとして設定することでこれを行うことができます

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

または、私が好むのは、このようにフィールドにプレフィックスを使用し始めることです

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

そして、このように UpdateModel を呼び出します

UpdateModel(e, "Employee")

h番目

于 2009-07-01T15:37:59.303 に答える