L'entità del modello con marchio WPF ed EF6 ha chnages

.net entity-framework entity-framework-6 vb.net wpf

Domanda

Background: ho un'applicazione wpf 4.5 che è stata costruita con MVVM (MVVM-Light) ed Enitity Framework 6 db prima.

Ho diversi viewmodels che hanno un elenco / dettagli impostati con un elenco di oggetti in una listbox e una griglia di dettagli che visualizza e consente all'utente di modificare il record selezionato della listbox. Ho un pulsante SAVE e UNDO nella parte superiore della griglia che voglio "abilitare" quando ci sono modifiche all'entità modello sottostante del record selezionato.

Sono in grado di farlo, ma le prestazioni della mia attuale soluzione sono terribili e ho bisogno di una nuova strategia per rilevare i cambiamenti nel mio modello.

Cosa ho ora:

Ho un metodo CanSaveExecute che è il callback CanExecute di un oggetto ICommand. In questo metodo, interrogo le entità di DbContext ChangeTracker per verificare se sono presenti oggetti del tipo desiderato.

 Try
    If _Selection IsNot Nothing AndAlso _Selection.HasErrors = False Then
         Return (From entry In Context.ChangeTracker.Entries(Of job)() Where entry.Entity.idJob = _Selection.idJob And entry.State = EntityState.Modified Select entry).Count
    Else
         Return False
    End If
 Catch ex As Exception
    Return False
 End Try

Il problema è che questa query delle voci del tracker modifiche sta distruggendo le prestazioni dell'interfaccia utente. Causa un serio ritardo con l'input dell'utente.

La mia domanda:

Qualcuno ha una strategia migliore per rilevare le modifiche in un metodo CanExecute con Entity Framework 6? Preferibilmente senza cambiare il codice T4 (ma ho la sensazione che questo è dove finirò).


Più dettaglio:

Ecco come viene impostato il mio modello. EF6 genera per me una semplice classe di entità simile a questa (ho rimosso molte proprietà per mantenerla semplice come esempio) :

Imports System
Imports System.Collections.Generic

Partial Public Class job
    Public Property idJob As Integer
    Public Property idLinkedJob As Nullable(Of Integer)
    Public Property idStatus As Byte
    Public Property idEstimate As Nullable(Of Integer)
    Public Property chrTitle As String

    Public Overridable Property alerts As ICollection(Of alert) = New HashSet(Of alert)
    Public Overridable Property client As client
End Class

Estendo la classe con un'altra classe parziale per aggiungere regole di validazione dei dati come questa (di nuovo, semplificata per esempio) :

Partial Public Class job
    Inherits ValidationBase

#Region "PROPERTIES"
    Public Property HasChanges As Boolean = False
#End Region

#Region "CONSTRUCTORS"
    Public Sub New()
        ''default values
        Me.FTC_Type = 4
        Me.dtCreated = Now
        Me.dtUpdated = Now
        'HasChanges = False
    End Sub

    Public ReadOnly Property DisplayPath
        Get
            Return "W" + idJob.ToString + ": " + chrTitle + " - " + client.chrCompany
        End Get
    End Property
#End Region

#Region "VALIDATION FUNCTIONS"

    Public Overrides Function Validate(validationContext As ComponentModel.DataAnnotations.ValidationContext) As IEnumerable(Of ComponentModel.DataAnnotations.ValidationResult)
        Return MyBase.Validate(validationContext)
        PropertyValitaion(True)
    End Function

    Public Sub PropertyValitaion(bAllProperties As Boolean, Optional sProperty As String = "")
        'initialize validation helper

        If bAllProperties OrElse sProperty = "chrTitle" Then
            If String.IsNullOrEmpty(chrTitle) Then
                AddError("chrTitle", "You must enter a Job Title")
            Else
                RemoveError("chrTitle")
            End If
        End If
        If bAllProperties OrElse sProperty = "idClient" Then
            If idClient < 1 Then
                AddError("idClient", "You must select a job client")
            Else
                RemoveError("idClient")
            End If
        End If

        If String.IsNullOrEmpty(sProperty) = False Then
            OnPropertyChanged(sProperty)
        End If

    End Sub
#End Region
End Class

Nessuna soluzione:

Quindi, dopo aver combattuto per un giorno, ho deciso che @Shoe ha ragione. È risultato essere troppo lavoro per questa funzione. Non potrei mai ricevere una chiamata al tracker delle modifiche per non causare il ritardo dell'interfaccia utente.

Risposta popolare

Non vedo alcun vantaggio per le modifiche che MS ha apportato a Entity Framework. Le classi non supportano più il rilevamento delle modifiche e l'esecuzione di query se sono presenti modifiche molto più lente rispetto all'utilizzo di dbcontext. Vorrei che avessero documentato meglio tutti questi cambiamenti, quindi non avrei perso così tanto tempo a cercare di farlo funzionare.

A proposito, se uso un viewmodel e diciamo che ho un'entità prodotto con sessanta campi. In che modo le modifiche su questi campi vengono propagate al modello?



Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché