簡體   English   中英

攔截在實體框架6中無法正常工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM