2013-08-29 113 views
0

假設您有一個模擬發票的實體和建模發票項目的另一個實體。隨着發票項目的添加和修改,您將如何計算髮票上所有項目總值的總和?通過另一次更新更新一個實體

+0

更新它們在哪裏?在記憶中?在一個頁面上?你正在計算,你爲什麼要更新總數? –

+0

一般來說,不斷更新總計並將它們保存在數據庫中是不好的做法,您可以爲'Total'屬性添加'[NotMapped]',並創建一個'GetTotal'方法,該方法在訪問屬性時返回發票總額。 – SOfanatic

+0

我的這個專欄的理論是讓我對db執行更高效的請求。那肯定有價值嗎? –

回答

0

雖然我會同意在數據庫中存儲計算字段的建議,但如果您希望可以使用攔截器攔截髮票項目的任何更改並從那裏重新計算髮票。

這裏有實施攔截的一個很好的例子:http://iextendable.com/2010/10/20/implementing-ef4-change-interceptors/

它是基於EF4但EF5確實工作。

有一個包的NuGet包含稱爲Isg.EntityFramework攔截代碼這又是在上述網站

使用最新版本的NuGet的打包代碼看起來是這樣的:

public class RecalculateInvoiceTotalInterceptor : Isg.EntityFramework.Interceptors.TypeInterceptor 
{ 
    public RecalculateInvoiceTotalInterceptor(Type targetType) 
     : base(targetType) 
    { 

    } 

    protected override void OnBefore(DbEntityEntry item, System.Data.EntityState state, InterceptionContext context) 
    { 
     base.OnBefore(item, state, context); 

     // Code here to update invoice 
    } 

} 

您還需要註冊攔截器:

InterceptorProvider.SetInterceptorProvider(new DefaultInterceptorProvider(new AuditInterceptor())); 

有,你也可以使用,但隨後日類似OnAfter方法重新計算將在InvoiceItem事務之外。您可以通過傳遞給OnBefore方法的InterceptionContext訪問DbContext

+0

有趣的是,知道攔截器可用,但似乎像解決它的過於複雜的方式,就像你說的,我應該計算這個字段,而不是長期存儲它。感謝您的建議 –