ef core sqlconnection tryopen nullreferenceexception

时间:2018-04-05 01:55:06

标签: connection-string nullreferenceexception ef-core-2.0

当我使用预构建的(在我们的自定义基础中)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");
        }
    }
}

我在此处设置断点,并且每次将连接字符串设置为相同的值。所以我不明白同一个上下文的一个实例如何有一个空的连接字符串。

有谁知道问题的根本原因?

谢谢,

1 个答案:

答案 0 :(得分:1)

所以这发生是因为我正在处理从context.Database.GetDbConnection()中检索的连接。我为SqlQuery和ExecuteCommand创建了polyfill,它需要一个连接字符串。因此,一旦其中一个被调用,我将失去当前上下文的连接。