WPF und EF6 markieren Modell Entität als Chnages

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

Frage

Hintergrund: Ich habe eine wpf 4.5 Anwendung, die mit MVVM (MVVM-Light) und Enitity Framework 6 db erstellt wird.

Ich habe mehrere Ansichtsmodelle, die eine Liste / Details mit einer Liste von Objekten in einem Listenfeld und einem Detailraster, das anzeigt, und dem Benutzer das Bearbeiten des ausgewählten Datensatzes des List-Felds ermöglicht. Ich habe eine SAVE und UNDO-Schaltfläche an der Spitze des Gitters, das ich "aktivieren" möchte, wenn Änderungen an der zugrunde liegenden Modell-Entität des ausgewählten Datensatzes sind.

Ich bin dazu in der Lage, aber die Leistung meiner derzeitigen Lösung ist schrecklich und ich brauche eine neue Strategie, um Änderungen an meinem Modell zu erkennen.

Was ich jetzt habe:

Ich habe eine CanSaveExecute-Methode, bei der es sich um den CanExecute-Callback eines ICommand-Objekts handelt. In dieser Methode frage ich die EF dbContext ChangeTracker-Entitäten ab, um zu sehen, ob irgendwelche Objekte meines gewünschten Typs vorhanden sind.

 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

Das Problem besteht darin, dass diese Abfrage der Change Tracker-Einträge die UI-Leistung zerstört. Es verursacht eine ernsthafte Verzögerung bei der Benutzereingabe.

Meine Frage:

Hat jemand eine bessere Strategie zum Erkennen von Änderungen in einer CanExecute-Methode mit Entity Framework 6? Vorzugsweise ohne den T4-Codee zu ändern (aber ich habe das Gefühl, dass ich hier enden werde).


Mehr Details:

Hier ist, wie mein Modell aufgebaut ist. EF6 erzeugt eine einfache Entity-Klasse für mich, die so aussieht (ich habe viele Eigenschaften entfernt, um es einfach zu halten) :

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

Ich erweitere diese Klasse mit einer anderen Teilklasse, um Datenvalidierungsregeln wie diese hinzuzufügen (wiederum vereinfacht zum Beispiel) :

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

Keine Lösung:

Nachdem ich einen Tag lang damit gestritten habe, habe ich entschieden, dass @Shoe Recht hat. Es erwies sich als zu viel Arbeit für dieses Feature. Ich könnte nie einen Anruf an den Änderungs-Tracker erhalten, um keine UI-Verzögerung zu verursachen.

Beliebte Antwort

Ich sehe keine Vorteile gegenüber den Änderungen, die MS an Entity Framework vorgenommen hat. Die Klassen unterstützen keine Änderungsverfolgung und Abfragen mehr, wenn Änderungen viel langsamer sind als die Verwendung von dbcontext. Ich wünschte, sie hätten all diese Veränderungen besser dokumentiert, also hätte ich nicht so viel Zeit verschwendet, um das zu erreichen.

Übrigens, wenn ich ein Viewmodel verwende und sagen wir, ich habe eine Produkteinheit mit sechzig Feldern. Wie werden die Änderungen in diesen Feldern an das Modell weitergegeben?



Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum