WPF y EF6 marcan entidad modelo con cambios

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

Pregunta

Antecedentes: Tengo una aplicación wpf 4.5 que está construida con MVVM (MVVM-Light) y Enitity Framework 6 db primero.

Tengo varios modelos de vista que tienen una lista / detalles configurados con una lista de objetos en un cuadro de lista y una cuadrícula de detalles que muestra y permite al usuario editar el registro seleccionado del cuadro de lista. Tengo un botón GUARDAR y DESHACER en la parte superior de la cuadrícula que quiero "habilitar" cuando hay cambios en la entidad modelo subyacente del registro seleccionado.

Puedo hacerlo, pero el rendimiento de mi solución actual es terrible y necesito una nueva estrategia para detectar cambios en mi modelo.

Lo que tengo ahora:

Tengo un método CanSaveExecute que es la devolución de llamada CanExecute de un objeto ICommand. En ese método, pregunto en las entidades EF de dbContext ChangeTracker para ver si hay algún objeto de mi tipo deseado presente.

 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

El problema es que esta consulta de las entradas de seguimiento de cambios está destruyendo el rendimiento de la interfaz de usuario. Causa un serio retraso con la entrada del usuario.

Mi pregunta:

¿Alguien tiene una mejor estrategia para detectar cambios en un método CanExecute con Entity Framework 6? Preferiblemente sin cambiar el código T4 (pero tengo la sensación de que aquí es donde terminaré).


Mas detalle:

Aquí es cómo se configura mi modelo. EF6 genera una clase de entidad simple para mí que se parece a esto ( eliminé muchas propiedades para mantenerlo simple como ejemplo) :

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

Extiendo esa clase con otra clase parcial para agregar reglas de validación de datos como esta (nuevamente, simplificado por ejemplo) :

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

Sin solución:

Así que después de luchar con él por un día, he decidido que @Shoe tiene razón. Resultó ser demasiado trabajo para esta característica. Nunca podría recibir una llamada al rastreador de cambios para no causar un retraso en la IU.

Respuesta popular

Simplemente no veo ninguna ventaja sobre los cambios que MS ha hecho en Entity Framework. Las clases ya no admiten el seguimiento de cambios y la consulta si hay cambios es muchas veces más lenta que usar dbcontext. Desearía que hubieran documentado mejor todos estos cambios para no haber perdido tanto tiempo intentando que esto funcionara.

Por cierto, si uso un modelo de vista y digamos que tengo una entidad de producto con sesenta campos. ¿Cómo se propagan de nuevo al modelo los cambios en esos campos?



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué