【问题标题】:Entity Framework - updating sum of related entity collection property values on parent entity实体框架 - 更新父实体上相关实体集合属性值的总和
【发布时间】:2013-05-24 19:30:15
【问题描述】:

如何有效地更新父 EntityObject 属性以仅公开相关子实体集合属性的总和?每当任何子实体中的属性值发生变化时,我都需要在父级中进行更新。

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

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

每当 Employee 属性发生变化时,我总是在 Company 对象中运行完整的查询,例如:

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

...这看起来是一件非常低效的事情,尤其是如果 Employee 类中的所有自定义属性值都通过循环进行了更改(例如,上面的查询一遍又一遍地运行)。

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

【问题讨论】:

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

标签: entity-framework parent-child custom-properties


【解决方案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 更快的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 2012-01-15
    • 2011-03-06
    • 1970-01-01
    相关资源
    最近更新 更多