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方法,它是ICommand對象的CanExecute回調。在該方法中,我查詢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

我用另一個部分類擴展該類,以添加像這樣的數據驗證規則(再次,簡化為例)

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是對的。結果證明這個功能太多了。我永遠無法調用更改跟踪器,以免導致UI延遲。

熱門答案

我只是沒有看到MS對Entity Framework所做的更改有任何好處。這些類不再支持更改跟踪和查詢,如果有更改比使用dbcontext慢很多倍。我希望他們能更好地記錄所有這些變化,這樣我就不會浪費那麼多時間來試圖讓它發揮作用。

順便說一句,如果我使用viewmodel,讓我說我有60個字段的產品實體。這些字段的更改如何傳播回模型?



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因