WPF와 EF6 모델 엔티티가 chnages를 갖는 것으로 표시

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

문제

배경 : MVVM (MVVM-Light) 및 Enitity Framework 6 db를 기본으로 구축 된 wpf 4.5 응용 프로그램이 있습니다.

필자는 목록 / 세부 사항이 목록 상자에있는 개체 목록으로 설정된 여러보기 모델과 표시되는 세부 묘사 및 사용자가 목록 상자의 선택된 레코드를 편집 할 수 있도록합니다. 선택된 레코드의 기본 모델 엔티티가 변경 될 때 "활성화"하고자하는 그리드 상단에 SAVE 및 UNDO 버튼이 있습니다.

이 작업을 수행 할 수는 있지만 현재 솔루션의 성능은 끔찍하며 내 모델의 변경 사항을 감지하는 새로운 전략이 필요합니다.

내가 지금 가지고있는 것 :

ICommand 개체의 CanExecute 콜백 인 CanSaveExecute 메서드가 있습니다. 이 메소드에서 EF dbContext ChangeTracker Entities에 쿼리하여 원하는 유형의 객체가 있는지 확인합니다.

 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

문제 는이 추적 프로그램 항목의 쿼리가 UI 성능을 파괴하고 있다는 것입니다. 사용자 입력시 심각한 지연이 발생합니다.

내 질문:

누군가 Entity Framework 6을 사용하여 CanExecute 메서드의 변경 사항을 감지하는 더 나은 전략을 가지고 있습니까? 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

해결책 없음 :

그래서 하루 동안 그것과 싸운 후에 나는 @ 신발이 옳다고 결정했습니다. 그것은이 특징을 위해 너무 많은 일로 밝혀졌습니다. UI 지연을 발생시키지 않기 위해 변경 추적기를 호출 할 수 없습니다.

인기 답변

MS가 Entity Framework에 내린 변경 사항에 어떤 이점도 보이지 않고 있습니다. 변경 사항이 dbcontext를 사용하는 것보다 몇 배 느린 경우 클래스는 더 이상 변경 사항 추적 및 쿼리를 지원하지 않습니다. 나는 그들이이 모든 변화를 더 잘 문서화했기를 바란다. 그래서 나는 이것을 작동시키기 위해 많은 시간을 낭비하지는 않을 것이다.

Btw, 뷰 모델을 사용하고 60 개의 필드가있는 제품 엔터티가 있다고 가정 해 보겠습니다. 해당 필드의 변경 사항을 모델로 다시 전파하는 방법은 무엇입니까?



Related

아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.