当我使用预构建的(在我们的自定义基础中)db上下文时,我得到一个奇怪的错误我得到以下异常
System.NullReferenceException: Object reference not set to an instance of an object.
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.Open()
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.BufferlessMoveNext(Boolean buffer)
at Microsoft.EntityFrameworkCore.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()
at System.Linq.Enumerable.SelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)
at lambda_method(Closure , QueryContext )
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass17_1`1.<CompileQueryCore>b__0(QueryContext qc)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)
at System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 source)
...(ommitted on purpose)
如果我使用相同数据库上下文的新实例,则错误将消失。我注意到当我们使用预构建的上下文获得DbConnection时,连接没有连接字符串,但是新实例的设置正确。
我使用OnConfiguring配置提供程序如下:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
if (_provider == Providers.SqlServer)
{
optionsBuilder.UseSqlServer(_connectionString);
}
else
{
throw new NotImplementedException("Provider not supported");
}
}
}
我在此处设置断点,并且每次将连接字符串设置为相同的值。所以我不明白同一个上下文的一个实例如何有一个空的连接字符串。
有谁知道问题的根本原因?
谢谢,
答案 0 :(得分:1)
所以这发生是因为我正在处理从context.Database.GetDbConnection()中检索的连接。我为SqlQuery和ExecuteCommand创建了polyfill,它需要一个连接字符串。因此,一旦其中一个被调用,我将失去当前上下文的连接。