假設您有一個模擬發票的實體和建模發票項目的另一個實體。隨着發票項目的添加和修改,您將如何計算髮票上所有項目總值的總和?通過另一次更新更新一個實體
0
A
回答
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
有趣的是,知道攔截器可用,但似乎像解決它的過於複雜的方式,就像你說的,我應該計算這個字段,而不是長期存儲它。感謝您的建議 –
相關問題
- 1. 實體框架:更新實體時更新另一個實體
- 2. 實體框架更新一個父實體更新另一個父實體
- 3. 如何通過工作流程從另一實體更新一個實體
- 4. 學說:從另一個實體更新一個實體
- 5. 通過DTO更新實體
- 6. 更新了一個更新面板,另一個更新了?
- 7. 來自另一個實體的學說更新實體
- 8. 更新與另一個實體關係的實體春天
- 9. Doctrine2實體PrePersist - 更新另一個實體
- 10. 一個更新一次
- 11. 更新另一個表時更新表
- 12. 更新另一個表時,另一個更新
- 13. 基於另一個LINQ到實體的結果更新一個實體查詢
- 14. 更新的DataGridView從另一個窗體
- 15. MYSQL通過一個表格步驟並更新另一個
- 16. MySQL:通過一個表循環並更新另一個表?
- 17. 如何從另一個窗體更新()更新面板?
- 18. 使用JPA2一個實體更新
- 19. 通過服務更新大型實體
- 20. 通過實體框架更新
- 21. 更新腳本通過實體框架
- 22. 實體框架 - 通過屬性更新
- 23. 通過EventListener更新Hibernate實體
- 24. 如何刪除\更新學說的另一個實體後2個實體已被刪除\更新
- 25. 行動更新()來更新另一個模型的更新
- 26. 更新另一個表
- 27. 更新到另一個類
- 28. 更新與另一個表
- 29. 更新基於另一個
- 30. 更新,並從另一個
更新它們在哪裏?在記憶中?在一個頁面上?你正在計算,你爲什麼要更新總數? –
一般來說,不斷更新總計並將它們保存在數據庫中是不好的做法,您可以爲'Total'屬性添加'[NotMapped]',並創建一個'GetTotal'方法,該方法在訪問屬性時返回發票總額。 – SOfanatic
我的這個專欄的理論是讓我對db執行更高效的請求。那肯定有價值嗎? –