为什么在第一次使用 Entity Framework Core 调用存储过程时会收到“ConnectionString 属性尚未初始化”错误?

Fra*_*ois 2 sql-server entity-framework-core asp.net-core

我在 ASP.NET Core 中有一个服务,我向其中注入了我的 Entity Framework Core 上下文,该上下文用于定义我的服务将需要的私有函数。该 func 是关于调用存储过程。

对该 func 的第一次调用系统地导致错误

ConnectionString 属性尚未初始化。

但是,后续调用没问题。

这是服务类构造函数:

private readonly Func<Task<long>> _myFunc;

public MyService(MyContext context) => _myFunc= async () =>
    {
        using (var connection = context.Database.GetDbConnection())
        {
            await connection.OpenAsync();

            using (var command = connection.CreateCommand())
            {
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = "sp_MyStoredProcedure";
                command.Parameters.Add(new SqlParameter("@AParameter", SqlDbType.Int) { Value = 1 });
                return (long)await command.ExecuteScalarAsync();
            }
        }
    };
Run Code Online (Sandbox Code Playgroud)

这是stacktrace

System.InvalidOperationException: ConnectionString 属性尚未初始化。

在 System.Data.SqlClient.SqlConnection.PermissionDemand()
在 System.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection)
在 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource 1 重试, DbConnectionOptions userOptions) 在 System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) at System.Data.SqlClient.SqlConnection.OpenAsync(CancellationToken cancellingToken) --- 从上一个抛出异常的位置开始的堆栈跟踪结束 --- 在 Microsoft。 EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnectionAsync(布尔错误预期,CancellationToken 取消令牌)1 retry, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource

更新:

当我在线设置断点await connection.OpenAsync()并查看变量时connection,连接字符串就在那里并且是正确的。

请注意,它MyServices被注入到控制器构造函数中。服务注册是这样完成的startup.cs

services.AddTransient<IMyService, MyService>();
Run Code Online (Sandbox Code Playgroud)

Grz*_*lko 5

尽量不要按照/sf/answers/763829111/ 中的建议处理连接。

所以,基本上,替换using (var connection = context.Database.GetDbConnection())var connection = context.Database.GetDbConnection(),看看它是否有帮助。