Entity framework 实体框架-更新父实体上相关实体集合属性值的总和

Entity framework 实体框架-更新父实体上相关实体集合属性值的总和,entity-framework,parent-child,custom-properties,Entity Framework,Parent Child,Custom Properties,如何有效地更新父EntityObject属性,该属性仅公开相关子实体集合属性的总和?当任何子实体中的属性值发生更改时,我都需要父实体中的更新 例如:我有一个父EntityObject“Company”和一个相关子对象集合“Employee”。它们在EF中相互关联(一家公司到一群员工)。在Employee分部类中,我添加了自定义计算属性“Salary”,在Company分部类中,我添加了自定义属性“TotalSalaries” 现在,如果任何Employee Salary属性更新为新值,我想立即更

如何有效地更新父EntityObject属性,该属性仅公开相关子实体集合属性的总和?当任何子实体中的属性值发生更改时,我都需要父实体中的更新

例如:我有一个父EntityObject“Company”和一个相关子对象集合“Employee”。它们在EF中相互关联(一家公司到一群员工)。在Employee分部类中,我添加了自定义计算属性“Salary”,在Company分部类中,我添加了自定义属性“TotalSalaries”

现在,如果任何Employee Salary属性更新为新值,我想立即更新Company对象属性TotalSalaries值

每当Employee属性发生更改,如果发生更改,我总是在Company对象内运行完整查询,如:

TotalSalaries = Me.Employees.Sum(Function(x) x.Salary)
…这看起来效率很低,尤其是当Employee类中的所有自定义属性值都通过循环(例如,上面的查询被反复运行)进行更改时


属性更新能否更有效地反映在父类中?

我已经解决了这个问题。在Employee类上,我可以在类级别的PropertyChange事件中捕获原始属性值:

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事件或[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快得多的方法。

它可能看起来效率低下,但实际上,如果所有内容都在内存中运行,它可能会非常快。我会尝试优化它,只有当它不可接受地延迟了它的影响时。好吧,它可能很快,但我认为它可以更快:假设我有10万名员工,其中一名员工的工资增加了10%(例如,原值1000->1100)。我是否可以只将此更改(+100)传递给父对象,并告诉该对象“将此增加添加到您的总工资”,而不是在99 999不变的情况下对100000个项目运行查询。这可能吗?第二种情况可能是,所有这10万名员工的工资同时增加10%。现在,如果在property change->上激活该查询,则该查询将在所有员工上运行100000次以上,但我们需要做的是在所有个人薪资值更新后只运行一次。怎么做?不要更新
TotalSalaries
。让它成为一个计算过的属性(我本来以为是这样的)。因此,它仅在需要显示时计算。那真的很快。如有必要,您可以存储和显示计算值,并设置一个布尔值,以便在薪资发生更改时需要重新计算。