Entity Framework — обновление суммы значений свойств коллекции связанных сущностей в родительской сущности

Как я могу эффективно обновить родительское свойство EntityObject, которое должно отображать только сумму связанного свойства коллекции дочерних сущностей? Мне нужно обновление в родительском объекте каждый раз, когда происходит изменение значения свойства в любом из дочерних объектов.

Пример: у меня есть родительский объект EntityObject «Компания» и набор связанных дочерних объектов «Сотрудник». Они имеют связь в EF между собой (одна компания для набора сотрудников). В частичном классе Employee я добавил пользовательское вычисляемое свойство «Зарплата», а в частичном классе Company я добавил пользовательское свойство «TotalSalaries».

Теперь, если какое-либо свойство «Зарплата сотрудника» обновляется до нового значения, я хочу немедленно обновить значение TotalSalaries свойства объекта «Компания».

Всякий раз, когда изменяется свойство Employee, и если тогда я всегда запускаю полный запрос внутри объекта Company, например:

TotalSalaries = Me.Employees.Sum(Function(x) x.Salary)

... это выглядит очень неэффективно, особенно если все значения настраиваемых свойств в классе Employee изменяются, например, зацикливанием (приведенный выше запрос выполняется снова и снова).

Можно ли более эффективно отразить обновление свойства в родительском классе?


person Nuts    schedule 29.05.2013    source источник
comment
Это может выглядеть неэффективно, но на самом деле это может быть молниеносно, если все выполняется в памяти. Я бы попытался оптимизировать это только тогда, когда это неприемлемо задерживает все, на что влияет.   -  person Gert Arnold    schedule 29.05.2013
comment
Хорошо, это может быть быстро, но подумайте, что это можно было бы сделать еще быстрее: скажем, у меня есть 100 000 сотрудников, и у одного из сотрудников есть повышение заработной платы на 10% (например, исходное значение 1000 -> 1100). Могу ли я каким-то образом передать это изменение (+100) только родительскому объекту и указать объекту добавить это увеличение к вашему TotalSalaries вместо того, чтобы выполнять запрос по 100 000 элементов, где 99 999 не изменились. Это возможно?   -  person Nuts    schedule 30.05.2013
comment
Второй сценарий может заключаться в том, что все эти 100 000 сотрудников получат одновременное повышение заработной платы на 10%. Теперь этот запрос выполняется более 100 000 раз для всех сотрудников, если он активируется при изменении свойства, но нам нужно будет выполнить его только один раз после обновления всех индивидуальных значений заработной платы. Как это сделать?   -  person Nuts    schedule 30.05.2013
comment
Не обновлять TotalSalaries. Сделайте это вычисляемым свойством (которое, как я думал, было в первую очередь). Таким образом, он рассчитывается только тогда, когда это необходимо для отображения. Это может быть очень быстро. При необходимости вы можете сохранить и отобразить рассчитанное значение и установить логическое значение, что перерасчет необходим при изменении зарплаты.   -  person Gert Arnold    schedule 30.05.2013


Ответы (1)


Я понял это. В классе Employee я могу зафиксировать исходное значение свойства в событии PropertyChanging на уровне класса:

Private Sub employee_PropertyChanging(ByVal sender As Object, ByVal e As PropertyChangingEventArgs) Handles Me.PropertyChanging    
    Dim propBeignChanged As String = e.PropertyName
    If propBeignChanged = "Salary" Then
        OriginalValue = CType(sender, Employee).Salary  'store the current value temporarily to a variable
    End If
End Sub

Затем я могу получить новое значение либо в событии PropertyChanged на уровне класса, либо в событии On[Property]Changed для конкретного свойства, вычислить разницу по сравнению с временно сохраненным исходным значением и передать разницу родительскому объекту.

Private Sub OnSalaryChanged()
    Dim diff as Double = Me.Salary - OriginalValue 
    'and finally pass diff to the parent object for updating its total...
End Sub

Я считаю, что это должен быть гораздо более быстрый подход, чем запрос всей коллекции EntityCollection.

person Nuts    schedule 03.06.2013