簡體   English   中英

實體框架核心FromSQL引發ArgumentNullException

[英]Entity Framework core FromSQL throws ArgumentNullException

我正在使用C#(.net core v2.2)和EF core。 我有很舊的代碼正在從數據庫中檢索一行:

string id = "123";
using (var context = new UsersDb())
{
    var req = context.ScanRequests.FromSql($"EXEC GetById {id}").FirstOrDefault();
    // ...
}

GetById是一個存儲過程,用Azure SQL(基本上是SQL Server)編寫。

這段代碼最近開始引發異常:

System.ArgumentNullException: Value cannot be null.
Parameter name: key
   at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
   at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
   at lambda_method(Closure , ServiceProviderEngineScope )
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
   at Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()
   at Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider()
   at Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()
   at Microsoft.EntityFrameworkCore.DbContext.get_Model()
   at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.get_EntityType()
   at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.get_EntityQueryable()
   at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.System.Linq.IQueryable.get_Provider()
   at Microsoft.EntityFrameworkCore.RelationalQueryableExtensions.FromSql[TEntity](IQueryable`1 source, FormattableString sql)
   at ***.***Factory.<>c__DisplayClass0_0.<GetById>b__0() in /tmp/sources/SystemLayer/***/***.cs:line 29

當我在本地環境中使用相同的參數運行相同的代碼時,不會發生此問題。 而且,在大多數情況下,它也可以在生產服務器上運行。 我猜它的成功率至少為99.9%。

更新1

為了確定哪一行是有問題的(創建進程或運行FromSql方法),我添加了一條日志消息,並確定問題出在下面這樣:

var req = context.ScanRequests.FromSql($"EXEC GetById {id}").FirstOrDefault();

更新2

我以為問題可能是由於我到數據庫的映射-也許數據庫模式已更改而未相應更改EF。 因此,我再次運行映射命令:

Scaffold-DbContext "cs" ...

再次重新生成類后,我發現自上次提交GIT以來,沒有文件已更改。 因此,我的EF代碼已經與數據庫架構對齊。

更新3

我使用EF Nuget軟件包2.2.1版運行代碼。 我看到可以將EF軟件包更新為2.2.2。 我做到了,但沒有解決問題。 行為相同。

該怎么辦? 我還應該檢查什么?

您可能假設$"EXEC GetById {id}"是一個string ,但實際上是一個FormattableString ,如堆棧跟蹤所示:

at Microsoft.EntityFrameworkCore.RelationalQueryableExtensions.FromSql[TEntity](IQueryable`1 source, FormattableString sql)

因此,您不小心調用了另一種方法。 嘗試向string添加顯式強制轉換以執行所需的強制轉換:

var req = context.ScanRequests.FromSql((string)$"EXEC GetById {id}").FirstOrDefault();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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