Entity Framework - Consigli per la conservazione / l'aggiornamento della vecchia scuola?

1

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!

    
posta Richard 28.10.2016 - 16:06
fonte

0 risposte