WPF et EF6 marquent l'entité modèle comme ayant des modifications

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

Question

Arrière-plan: J'ai d'abord une application wpf 4.5 construite avec MVVM (MVVM-Light) et Enitity Framework 6.

J'ai plusieurs modèles de vues qui ont une liste / détails configurés avec une liste d'objets dans une liste et une grille de détails qui affiche et permet à l'utilisateur de modifier l'enregistrement sélectionné de la liste. J'ai un bouton ENREGISTRER et ANNULER en haut de la grille que je souhaite "activer" lorsque des modifications sont apportées à l'entité de modèle sous-jacente de l'enregistrement sélectionné.

Je suis capable de le faire, mais les performances de ma solution actuelle sont terribles et j'ai besoin d'une nouvelle stratégie pour détecter les changements dans mon modèle.

Ce que j'ai maintenant:

J'ai une méthode CanSaveExecute qui est le rappel CanExecute d'un objet ICommand. DANS cette méthode, je demande à l'entité EF dbContext ChangeTracker Entities de voir si des objets du type souhaité sont présents.

 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

Le problème est que cette requête des entrées du suivi des modifications détruit les performances de l'interface utilisateur. Cela provoque de graves retards lors de la saisie de l'utilisateur.

Ma question:

Quelqu'un a-t-il une meilleure stratégie pour détecter les changements dans une méthode CanExecute avec Entity Framework 6? De préférence sans changer le code T4 (mais j'ai le sentiment que c'est là que je vais finir).


Plus de détails:

Voici comment mon modèle est mis en place. EF6 génère une classe d'entité simple pour moi qui ressemble à ceci (j'ai supprimé beaucoup de propriétés pour que ce soit simple, par exemple) :

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

J'étends cette classe avec une autre classe partielle pour ajouter des règles datavalidation comme ceci (encore une fois, simplifié par exemple) :

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

Pas de solution:

Donc, après avoir combattu pendant un jour, j'ai décidé que @Shoe avait raison. Il s’est avéré être trop de travail pour cette fonctionnalité. Je n'ai jamais pu appeler le suivi des modifications pour ne pas causer de décalage dans l'interface utilisateur.

Réponse populaire

Je ne vois tout simplement aucun avantage aux modifications apportées par MS à Entity Framework. Les classes ne prennent plus en charge le suivi des modifications et l'interrogation des modifications est beaucoup plus lente que l'utilisation de dbcontext. J'aurais aimé qu'ils aient mieux documenté tous ces changements afin de ne pas perdre autant de temps à essayer de faire en sorte que cela fonctionne.

Btw, si j'utilise un viewmodel et disons que j'ai une entité produit avec soixante champs. Comment les modifications apportées à ces champs sont-elles propagées dans le modèle?



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi