WPFおよびEF6は、モデルエンティティにチャンクを持つものとしてマークします。

.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エンティティにクエリして、目的のタイプのオブジェクトが存在するかどうかを確認します。

 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

このクラスを別の部分クラスで拡張しこのようなdatavalidationルールを追加します(例単純化)

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は合法ですか? はい、理由を学ぶ