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.
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
Jetzt verstehe ich dein Problem, ich aktualisierte meine Antwort. –
danke, das funktioniert perfekt! Sorry für die späte Antwort, habe dieses Wochenende nicht programmiert. – Tommy