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.
上找到解决方案(用于动态查询)和更多详细信息
我正在尝试按照显示的拦截示例 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.
上找到解决方案(用于动态查询)和更多详细信息