通过另一个更新更新一个实体

时间:2013-08-29 15:44:59

标签: entity-framework

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

1 个答案:

答案 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