1

好的 - 我在数据库中有两个表,员工和公司。以下是每个的基本模式

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,只是简单地更新员工姓名。

4

1 回答 1

4

你的观点如何?

像这样?

如果是,UpdateModel 会尝试将 request("Company") 中的字符串写入 e.Company,这不是字符串而是对象。

您真正想要更改的是 Employee.CompanyID 对吗?您可以通过使用带有新 ID 的隐藏输入来执行此操作,或者如果您想通过 CompanyName 查找 CompanyID,您可以编写自己的 ModelBinder。


编辑

哦,你不想更新公司,对不起我的错。在这种情况下,您需要告诉 UpdateModel 忽略您的 POST 中存在的公司

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")

hth

于 2009-07-01T15:37:59.303 回答