2015-10-11 39 views
0

我這行「演員到值類型‘布爾’失敗,因爲物化值爲null」沒事的時候是空

if (EF.ctx.Searches.Any(x => x.SearchTerm == _searchTerm && x.IpAddress == ip && x.Time > dtRecent)) 

隨機(很少,非重複性)引發此錯誤

由於物化值爲空,所以強制類型值爲'布爾值'的轉換失敗。結果類型的泛型參數或查詢都必須使用可爲空的類型。

在數據庫中,只有IpAddress可以爲空(但到目前爲止沒有空IpAddress的記錄)。
每次拋出錯誤時,沒有一個變量爲空。

最接近的問題是Queryable.Any() returning null?
但這個錯誤對我來說還是沒有意義的。

我真的很好奇,究竟是什麼null在那一行?

堆棧跟蹤:

在System.Data.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader 1.GetValue(DbDataReader reader, Int32 ordinal) at lambda_method(Closure , Shaper) at System.Data.Common.Internal.Materialization.Coordinator 1.ReadNextElement(整形器整形器) 在System.Data.Common.Internal.Materialization.Shaper 1.SimpleEnumerator.MoveNext() at System.Linq.Enumerable.Single[TSource](IEnumerable 1個源) at System.Data.Objects.ELinq.ObjectQueryProvider.b__3 [TResult](IEnumerable 1 sequence) at System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable 1 query,Expression queryRoot) at System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute [S](Expression表達式) at System.Linq.Queryable.Any [TSource](IQueryable 1 source, Expression 1謂語) 在[我的代碼,上面的線]

+0

當你說'不可重現'時,你是否要重新測試數據庫,相同的參數等?如果是的話,你可以分析數據庫並執行一些壓力測試來試圖強制這種情況發生嗎?這可能是你最好的機會。 –

+0

很難相信「任何」都會在這裏拋出一些異常。它應該被翻譯成一些sql查詢(使用'EXISTS'),這裏的實現結果只是'bool'轉換而來的'bit'。 SQL查詢應始終返回「0」或「1」。但不知何故,物化不能完成。你可以檢查生成的SQL查詢(儘管我不認爲它可能涉及 - 它應該是直接對db執行並返回0或1)。 –

+0

@KirkBroadhurst是的,在catch塊中,我用相同的參數重新評估表達式,它不會再次拋出異常。我已經嘗試過一個評估表達式失敗的循環,1000s的時間,還沒有能夠重現它。 – Aximili

回答

0

我認爲這不是導致此錯誤表的內容,但是這是查詢的一部分的變量之一:要麼_searchTermipdtRecent絕具有無效值並且無法轉換爲有效的SQL查詢或查詢包含無效值。

連接登錄到Database.Log和檢查查詢EF創建:

using (var context = new YourContext()) 
{ 
    context.Database.Log = Console.Write; 

    // Your code here... 
} 

你可以找到Logging and Intercepting Database Operations

+0

謝謝,但它不可重複(即使有完全相同的參數),它很少發生 – Aximili

0

更多信息,對我來說,這就像databasehas一些變化,所以我們清理了一些表和是嗎。

我的意思是修改你的數據庫。

相關問題