[英]Interception not working as expected with Entity Framework 6
我正在嘗試遵循此處顯示的攔截示例,以使其與EF 6配合使用,但遇到函數RewriteFullTextQuery
的問題,如圖1所示。該攔截似乎有效,但實際上並未執行for
循環中的邏輯RewriteFullTextQuery
方法的功能,因為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))
{
圖2所示的ReaderExecuting函數正在調用ReaderExecuting
函數,該函數為其提供了引起所有麻煩的命令參數。
圖2:ReaderExecuting功能
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();
事實證明,這是由於實體框架生成SQL的方式所致。 如果將字符串文字作為搜索值傳遞給LINQ語句,則它不會生成使用參數的SQL。 但是,如果您將搜索值作為變量傳遞,它將生成利用參數的SQL。 一個解決方案(用於動態查詢)和更多詳細信息可以在此Blog上找到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.