Ho una domanda per te relativa al miglior utilizzo di EF6 quando usi Winforms ma non ho giustificazioni per cambiare le cose in qualcosa di più moderno.
Ho una mezza dozzina di classi basate su DbContext quindi non c'è traccia di cambiamento (devo ancora capire perché, ma questa è una domanda diversa). Ho una forma di database che utilizza queste classi in vari modi.
Al momento ho classi parziali costruite seguendo le linee seguenti - eppure la duplicazione del codice mi sta davvero a cuore.
Vorrei fare il salvataggio e l'aggiornamento generico ma non posso fare affidamento sulla denominazione della chiave primaria - e poiché questa è solo una piccola area, non posso giustificare il tentativo di fare un ulteriore livello di reindirizzamento. Quindi, dati questi limiti, mi manca l'ovvio in come applicare le interfacce / l'ereditarietà per fare in modo che funzioni su 4 o 5 tipi?
Public Shared Sub Save(TaskSession As TaskSession)
Using db As New StaffAbsenceEntities
If TaskSession.JobTaskSessionID = 0 Then
db.TaskSessions.Add(TaskSession)
Else
Update(TaskSession, db)
End If
db.SaveChanges()
End Using
End Sub
Private Shared Sub Update(TaskSession As TaskSession, ByRef db As StaffAbsenceEntities)
Dim oldAbsence = db.TaskSessions.Find(TaskSession.JobTaskSessionID)
For Each p In TaskSession.GetType.GetProperties
If p.Name = "JobTaskSessionID" Then Continue For 'Avoid primary key or any damned entity property!
If p.PropertyType.Name.Contains("Nullable") Then
If Not Nullable.Equals(p.GetValue(TaskSession), p.GetValue(oldAbsence)) Then p.SetValue(oldAbsence, p.GetValue(TaskSession))
Else
If p.GetValue(TaskSession) <> p.GetValue(oldAbsence) Then p.SetValue(oldAbsence, p.GetValue(TaskSession))
End If
Next
End Sub
End Class
Partial Class StaffAbsence
Public Shared Sub Save(staffabsence As StaffAbsence)
Using db As New StaffAbsenceEntities
If staffabsence.AbsenceID = 0 Then
db.StaffAbsences.Add(staffabsence)
Else
Update(staffabsence, db)
End If
db.SaveChanges()
End Using
End Sub
Private Shared Sub Update(staffabsence As StaffAbsence, ByRef db As StaffAbsenceEntities)
Dim oldAbsence = db.StaffAbsences.Find(staffabsence.AbsenceID)
For Each p In staffabsence.GetType.GetProperties
If p.Name = "AbsenceID" Then Continue For 'Avoid primary key or any damned entity property!
If p.PropertyType.Name.Contains("Nullable") Then
If Not Nullable.Equals(p.GetValue(staffabsence), p.GetValue(oldAbsence)) Then p.SetValue(oldAbsence, p.GetValue(staffabsence))
Else
If p.GetValue(staffabsence) <> p.GetValue(oldAbsence) Then p.SetValue(oldAbsence, p.GetValue(staffabsence))
End If
Next
End Sub
End Class
Mi rendo conto che se avessi capito come fare un ulteriore livello, avrei potuto creare una piccola gerarchia di ereditarietà ma spero che ci sia una soluzione chiara che non ha necessariamente bisogno di questo dato che non ho tempo sufficiente per implementarlo!