WPF и EF6 обозначают модель объекта как имеющие chnages

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

Вопрос

Предпосылки: У меня есть приложение wpf 4.5, которое создано с MVVM (MVVM-Light) и Enitity Framework 6 db.

У меня есть несколько режимов просмотра, в которых есть список / детали, настроенные со списком объектов в списке и сеткой данных, которая отображает и позволяет пользователю редактировать выбранную запись в списке. У меня есть кнопка SAVE и UNDO в верхней части сетки, которую я хочу «включить», когда есть изменения в основной модели объекта выбранной записи.

Я могу это сделать, но производительность моего текущего решения ужасна, и мне нужна новая стратегия для обнаружения изменений в моей модели.

Что у меня сейчас:

У меня есть метод CanSaveExecute, который является обратным вызовом CanExecute объекта ICommand. В этом методе я запрашиваю объекты EF dbContext ChangeTracker, чтобы увидеть, имеются ли какие-либо объекты моего желаемого типа.

 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

Проблема в том, что этот запрос записей отслеживания изменений разрушает производительность пользовательского интерфейса. Это вызывает серьезное отставание от пользовательского ввода.

Мой вопрос:

У кого-то есть лучшая стратегия для обнаружения изменений в методе CanExecute с Entity Framework 6? Предпочтительно, не меняя кодека T4 (но я чувствую, что это то, где я закончу).


Более детально:

Вот как моя модель настроена. EF6 генерирует для меня простой класс сущностей, который выглядит так (я удалил много свойств, чтобы упростить его в качестве примера) :

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

Я расширяю этот класс с помощью другого частичного класса, чтобы добавить такие правила передачи данных (например, упрощенные) :

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

Нет решения:

Поэтому, сражаясь с ним в течение дня, я решил, что @Shoe прав. Это оказалось слишком большой работой для этой функции. Я никогда не мог позвонить в трекер изменений, чтобы не вызывать отставание в пользовательском интерфейсе.

Популярные ответы

Я просто не вижу никаких преимуществ для изменений, внесенных MS в Entity Framework. Классы больше не поддерживают отслеживание изменений и запросы, если есть изменения, во много раз медленнее, чем использование dbcontext. Хотелось бы, чтобы они задокументировали все эти изменения, поэтому я бы не потратил столько времени, пытаясь заставить это работать.

Кстати, если я использую viewmodel и скажу, что у меня есть объект продукта с шестьюдесятью полями. Как изменения в этих полях возвращаются к модели?




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему