0

假设您有一个为发票建模的实体和另一个为发票项目建模的实体。随着发票项目的添加和修改,您将如何更新发票上所有项目的总价值?

4

1 回答 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 回答