2009-07-01 9 views
1

Ok - Ich habe zwei Tabellen in der Datenbank, Mitarbeiter und Unternehmen. Hier sind die grundlegenden Schemata für jedeASP.NET MVC, LINQ und UpdateModel Ausgaben

Table Companies 
CompanyID - GUID - PK 
CompanyName - NVarChar(100) 
Other Descriptive Fields.... 

Table Employees 
EmployeeID - GUID - PK 
CompanyID - GUID - FK 
Employee Descriptive Fields... 

So, jetzt habe ich eine Eins-zu-Beziehung wie jedes Unternehmen kann mehrere Mitarbeiter haben. Ich habe auch eine dataRepository für meine Mitarbeiter-Klasse mit den folgenden Funktionen erstellt:

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 

Alles bisher funktioniert großartig. Das Problem tritt auf, wenn ich einen Mitarbeiter bearbeiten muss. Hier sind meine Controller-Funktionen

<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 

Der Mitarbeiter gefunden wird, wird das Bearbeitungsformular bevölkert und die Post-Funktion feuert wie es sollte. Mein updateModel schlägt jedoch ohne wirkliche Erklärung fehl. Ich habe den Code durch das updateModel verfolgt und allen Attributen wurden die richtigen Werte zugewiesen. Wenn jedoch die Update den folgenden Abschnitt in der Klasse LinqToSql bekommt, wird der Wert für die Gesellschaft ist nichts und das ist, was den Fehler verursacht

<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 

Was soll ich mit dem FK Beziehung fehlt? Der vorherige Wert für Firma wird auf den korrekten Wert gesetzt, der in das UpdateModel geht, aber der aktuelle Wert ist nicht gesetzt. Wenn ich manuell jede Eigenschaft (e.firstname = request ("firstname"), usw.) setze und meine save-Methode für das dataRepository aufruft oder die Beziehung lösche und UpdateModel verwende, funktioniert alles ordnungsgemäß. Ich würde lieber das UpdateModel verwenden, da es den Code sauberer macht, usw. Sorry für den langen Post, aber das macht mich verrückt. Irgendwelche Ideen?

BTW, ich versuche nicht, den FK zu ändern, einfach nur den Namen des Mitarbeiters aktualisieren.

Antwort

4

Wie sieht Ihre Ansicht aus?

so?

wenn ja, Update versuchen würde, die Zeichenfolge in Anforderung („Gesellschaft“) zu e.Company die einen String isn `t zu schreiben, aber ein Objekt.

was Sie wirklich ändern möchten, ist das Employee.CompanyID Recht? Sie können dies tun, indem Sie eine verborgene Eingabe mit der neuen ID verwenden, oder wenn Sie die CompanyID über den CompanyName finden möchten, könnten Sie Ihren eigenen ModelBinder schreiben.


EDIT

oh Sie nicht Veranstaltung wollen das Unternehmen zu aktualisieren, meine Schuld, sry. in diesem Fall müssen Sie Update sagen, das Unternehmen zu ignorieren, die in ihrem POST vorhanden ist

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

Sie dies, indem Unternehmen als ausgeschlossen Eigentum wie diese

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

tun kann oder was ich bevorzuge, Sie könnten mit Präfix vorangestellt für Ihre Felder wie diese

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

und rufen Sie Update wie diese

0 beginnen
UpdateModel(e, "Employee") 

hth

+0

Nö, ist meiner Meinung nach nur von Mitarbeiterdatenelemente (Vorname, Nachname, etc.). Die Beziehung zwischen diesen beiden Tabellen soll eine Liste von Mitarbeitern für ein bestimmtes Unternehmen bereitstellen können. Die Ansicht wird korrekt mit den Daten verknüpft, aber sie wird beim Aktualisieren des Modells unterdrückt. Es sieht so aus, als ob sich das UpdateModel aufregt, dass keine Firma aus dem Formular zurückkommt, obwohl ich nichts aktualisiere, was mit dem Firmenberechtigungssystem zu tun hat, einschließlich der FK-Einschränkung für den Angestellten-Datensatz. – Tommy

+0

Jetzt verstehe ich dein Problem, ich aktualisierte meine Antwort. –

+0

danke, das funktioniert perfekt! Sorry für die späte Antwort, habe dieses Wochenende nicht programmiert. – Tommy