首页 > 解决方案 > 连接字符串属性尚未初始化 Entity Framework Core

问题描述

在我的 GenericRepository 中面对这个异常消息

ConnectionString 属性尚未初始化

我已经Startup.cs像这样配置了我的连接:

services.AddDbContext<DataContext>(opt => opt.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

我有另一个查询,我正在调用存储过程及其获取记录。但是当我从 EF 访问数据库时,它会抛出这个错误。

注意:我已经为这段代码编写了一个单元测试,它可以工作并从数据库中获取记录。

堆栈跟踪

在 System.Data.SqlClient.SqlConnection.PermissionDemand() 在 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 retry, DbConnectionOptions userOptions) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource1 次重试)在 System.Data.SqlClient.SqlConnection.OpenAsync(CancellationToken cancelToken) 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 Microsoft.EntityFrameworkCore.Storage。 RelationalConnection.d__48.MoveNext() 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Microsoft.EntityFrameworkCore.Storage.RelationalConnection.d__45.MoveNext() 在系统。 Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Microsoft.EntityFrameworkCore.Query.Internal。AsyncQueryingEnumerable1.AsyncEnumerator.<BufferlessMoveNext>d__12.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.<ExecuteAsync>d__72.MoveNext() 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Microsoft.EntityFrameworkCore.Query.Internal.AsyncQueryingEnumerable 1.AsyncEnumerator.<MoveNext>d__11.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Linq.AsyncEnumerable.SelectEnumerableAsyncIterator2.d__7.MoveNext() 在 D :\a\1\s\Ix.NET\Source\System.Interactive.Async\Select.cs:System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 的第 106 行在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)在 System.Runtime.CompilerServices.ConfiguredTaskAwaitable1.ConfiguredTaskAwaiter.GetResult() at System.Linq.AsyncEnumerable.AsyncIterator1.d__10.MoveNext() 在 D:\a\1\s\Ix.NET\Source\System.Interactive.Async\AsyncIterator.cs: 系统中 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 的第 98 行。 Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.ExceptionInterceptor 1.EnumeratorExceptionInterceptor.<MoveNext>d__5.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable1.ConfiguredTaskAwaiter.GetResult() at System.Linq.AsyncEnumerable.d__6 3.MoveNext() in D:\a\1\s\Ix.NET\Source\System.Interactive.Async\Aggregate.cs:line 120 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter1.GetResult() at Repositories.GenericRepository`1. d__9.MoveNext() 在 Repositories\Implementations\GenericRepository.cs:line 122

标签: c#.netentity-frameworkasp.net-coreef-core-2.0

解决方案


问题是我在我的存储库之前调用了一个 SPROC,我以老式的方式调用了 SPROC。context.Database.GetConnectionString()从using 语句中获取并使用该变量的连接字符串,该语句被包装在 try catch finally 块中。执行 SPROC 后,我手动关闭连接。这会导致存储库级别的异常。一旦我关闭连接字符串 EF 将无法连接到数据库,因为它的连接已在 using 语句中处理。

我找到了 2 个简单的解决方案 1。(推荐)我让 SPROC 返回多个表,这样我就不必再次调用存储库。2.(不推荐)我将Stratup.csfrom更新services.AddScoped<DbContext, DataContext>();services.AddTransient<DbContext, DataContext>();。如果您不熟悉此选项,我强烈建议您不要使用它。查看此链接以获取进一步说明


推荐阅读