实体框架6:DbContext实例的拦截器

时间:2017-06-09 21:27:43

标签: entity-framework entity-framework-6 interceptor ef-database-first

是否可以首先使用EF6数据库为DbContext的不同实例禁用拦截器?

我按照以下方式应用拦截器:

DbConfiguration.SetConfiguration(new InterceptorConfiguration());

InterceptorConfiguration的实现如下:

public class InterceptorConfiguration : DbConfiguration
{
    public InterceptorConfiguration()
    {
        AddInterceptor(new SoftDeleteInterceptor<T>());
    }
} 

我第一次实现了与此类似的东西: Entity Framework 6 Disable Interception temporarily

如果我在桌面应用程序中本地使用DbContext,那将会有效。我正在使用WCF,如果我以这种方式实现,它只是第一次为每个查询工作。

我使用条件DeleteDate is null扩展选择。下次我运行相同的选择时,拦截器不再运行。因此,当查询运行了软删除设置时,下次拦截器不会运行时,此查询是应用程序生命周期的软删除设置查询,直到我重新启动WCF应用程序。

我认为原因是DbExpressionBuilder对查询字符串中的DeleteDate is null进行了硬编码,并且EF期望它始终是该select语句的查询,而不会再次生成。

所以我试图提出另一个条件:(DeleteDate is null AND 1=1)。在1的位置,我预计EF将制作参数,但它没有这样做。它也硬编码了。

addign这个假的真实条件的代码如下所示:

if (_softDelete)
{
    var notDeleted = DbExpressionBuilder.IsNull(property);
    int two = 2;
    int two2 = 2;
    var fakeTrue = DbExpressionBuilder.Equal(DbExpression.FromInt32(two), DbExpression.FromInt32(two2));
    var filter = DbExpressionBuilder.And(notDeleted, fakeTrue);
    DbExpressionBuilder.Filter(binding, filter);
}
else
{
    int two = 2;
    int two2 = 2;
    var fakeTrue = DbExpressionBuilder.Equal(DbExpression.FromInt32(two), DbExpression.FromInt32(two2));
    DbExpressionBuilder.Filter(binding, fakeTrue);
}

如果我可以使用DbExpressionBuilder使用参数,而不是对值进行硬编码,那么对我来说可能会有好处。

对于删除例如,它正在进行中。我设置了DeleteDate,EF使用参数而不是硬编码查询。因此,如果我的第一个Delete作为soft-delete运行,那么拦截器也将运行下一个Delete语句。

0 个答案:

没有答案