2009-07-01 1 views
1

Ok - 데이터베이스, 직원 및 회사에 두 개의 테이블이 있습니다. 여기에 각각의 기본 스키마가 있습니다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... 

이제는 각 회사가 여러 직원을 가질 수 있으므로 일대일 관계가 있습니다. 다음 함수를 사용하여 직원 클래스에 대한 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 클래스의 다음 섹션에 도달 그러나, 회사의 가치는 아무것도이며,이 내가 FK 관계와 실종 무엇 실패

<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 

의 원인이 무엇입니까? 회사의 이전 값은 UpdateModel로 전달되는 올바른 값으로 설정되지만 현재 값은 설정되지 않습니다. 수동으로 각 속성 (e.firstname = request ("firstname") 등)을 설정하고 dataRepository에서 내 save 메서드를 호출하거나 관계를 제거하고 UpdateModel을 사용하면 모든 것이 제대로 작동합니다. 차라리 UpdateModel을 사용하면 코드 정리가 빨라집니다. 긴 게시물을 유감스럽게 생각합니다. 그러나 이것이 나를 괴롭 히고 있습니다. 어떤 아이디어?

나는 현재 직원 이름을 업데이트하기 만하면 FK를 변경하려고하지 않습니다.

답변

4

보기가 어떻게 생겼습니까?

이 마음에 드십니까?

예 인 경우 UpdateModel은 문자열이지만 요청이 아닌 e.Company에 요청 문자열 ("Company")을 쓰려고 시도합니다.

정말로 변경하고 싶은 것은 Employee.CompanyID입니다. 새 ID로 숨겨진 입력을 사용하거나 CompanyName에서 CompanyID를 찾으려면 자신 만의 ModelBinder를 작성할 수 있습니다.

오 해달라고 이벤트


편집, 회사를 업데이트 내 잘못을 SRY 싶다.당신이 내가 선호하는이

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

또는 어떤 거 제외 속성으로 설정 회사가이 작업을 수행 할 수 있습니다

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

게시물에 존재하는 회사를 무시 UpdateModel 말할 필요가있는 경우 , 이

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

처럼 필드의 프리픽스를 사용하여 시작이

공처럼 UpdateModel 부를 수
UpdateModel(e, "Employee") 

HTH

+0

아니, 내보기는 직원 데이터 항목 (이름, 성 등)이다. 이 두 테이블 간의 관계는 특정 회사의 직원 목록을 제공 할 수있게하는 것입니다. 뷰는 데이터와 올바르게 바인딩되지만 모델을 업데이트 할 때 질식합니다. UpdateModel이 화가 나고있는 것처럼 보입니다. 직원 레코드에 대한 FK 제약 조건을 포함하여 회사 자격과 관련이있는 것은 아니지만 양식에서 돌아 오는 회사 엔티티가 없다는 것입니다. – Tommy

+0

이제 귀하의 문제를 이해하고 답변을 업데이트했습니다. –

+0

감사합니다. 완벽하게 작동합니다! 늦은 응답으로 미안합니다. 이번 주말에 코딩하지 않았습니다. – Tommy