是否可以首先使用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语句。