Entity Framework 6 拦截未按预期工作

Interception not working as expected with Entity Framework 6

我正在尝试按照显示的拦截示例 here 使其与 EF 6 一起工作,但 运行 遇到函数 RewriteFullTextQuery 的问题,如图 1 所示。拦截似乎有效,但它实际上并没有执行 RewriteFullTextQuery 方法的 for 循环中的逻辑,因为 cmd.Parameters.Count 始终为零。此外,cmd.CommandText 属性 似乎显示了正确的 SQL 查询,我认为这是拦截工作正常的另一个证据。

图 1:RewriteFullTextQuery 代码摘录

 public static void RewriteFullTextQuery(DbCommand cmd)
    {
        string text = cmd.CommandText;
        for (int i = 0; i < cmd.Parameters.Count; i++)
        {
            DbParameter parameter = cmd.Parameters[i];
            if (parameter.DbType.In(DbType.String, DbType.AnsiString, DbType.StringFixedLength, DbType.AnsiStringFixedLength))
            {

RewriteFullTextQuery 函数正在由图 2 中所示的 ReaderExecuting 函数调用,该函数为其提供导致所有问题的命令参数。

图 2:Reader 执行函数

public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
    {
        RewriteFullTextQuery(command);
    }

尽管我的代码与示例不完全相同,但拦截似乎有效,所以它让我想知道什么条件会填充命令以具有更多 Parameters.Count比零?

仅当您将参数作为变量传递给查询时它才有效。如果您使用文字 EF 将不会使用参数。
我的意思是,这不会生成任何参数

context.Notes.Where(_ => _.NoteText == "CompareValue").Count();

这将

string compareValue = "CompareValue";
context.Notes.Where(_ => _.NoteText == compareValue).Count();

原来是因为Entity Framework生成SQL的方式。如果将字符串文字作为搜索值传递给 LINQ 语句,它不会生成使用参数的 SQL。但是,如果您将搜索值作为变量传递,它将生成使用参数的 SQL。可以在 blog.

上找到解决方案(用于动态查询)和更多详细信息