假设您有一个为发票建模的实体和另一个对发票项目建模的实体。当发票项目被添加和修改时,您如何更新发票上所有项目总价值的总和?
答案 0 :(得分: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