假设您有一个为发票建模的实体和另一个为发票项目建模的实体。随着发票项目的添加和修改,您将如何更新发票上所有项目的总价值?
问问题
74 次
1 回答
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
于 2013-08-29T16:45:25.800 回答