【发布时间】:2021-06-17 03:47:36
【问题描述】:
我有一个 ASP.NET Core Web 应用程序,我想为我的 IdentityServer4 解决方案添加 ASP.NET 身份和实体框架支持。我在我的解决方案中添加了迁移,然后运行了 cmd
dotnet tool install--global dotnet-ef
运行dotnet-ef cmds,然后运行以下cmds:
dotnet ef migrations add InitialIdentityServerMigration -c PersistedGrantDbContext
dotnet ef migrations add InitialIdentityServerMigration -c ConfigurationDbContext
之后,我尝试通过在每个数据库上下文中调用 dotnet ef database update 来创建我的数据库...当我运行 cmd 时:
dotnet ef database update -c PersistedGrantDbContext
我收到一条消息“构建开始”,然后构建成功,但最后,我收到一个错误。不知道为什么我会收到此错误:
Build started...
Build succeeded.
Microsoft.Data.SqlClient.SqlException (0x80131904):建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)
System.ComponentModel.Win32Exception (53):找不到网络路径。
在 Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常, Boolean breakConnection, Action
1 wrapCloseInAction) at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at Microsoft.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover, SqlAuthenticationMethod authType) at Microsoft.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) at Microsoft.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) at Microsoft.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) at Microsoft.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, Boolean applyTransientFaultHandling, String accessToken, DbConnectionPool pool) at Microsoft.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) at Microsoft.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) at Microsoft.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) at Microsoft.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) at Microsoft.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) at Microsoft.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) 在 Microsoft.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection,TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) at Microsoft.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 重试,DbConnectionOptions userOptions) 在 Microsoft.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection,DbConnectionFactory connectionFactory,TaskCompletionSource1 retry, DbConnectionOptions userOptions) at Microsoft.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource1 重试,SqlConnectionOverrides 覆盖) 在 Microsoft.Data.SqlClient.SqlConnection.Open(SqlConnectionOverrides 覆盖) 在 Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerConnection.OpenDbConnection(布尔错误预期) 在 Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenInternal(布尔错误预期) 在 Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(布尔错误预期) 在 Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerDatabaseCreator.c__DisplayClass18_0.b__0(日期时间放弃) 在 Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.c__DisplayClass12_02.<Execute>b__0(DbContext c, TState s) at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func3 操作,Func3 verifySucceeded) at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.Execute[TState,TResult](IExecutionStrategy strategy, TState state, Func2 操作,Func2 verifySucceeded) at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.Execute[TState,TResult](IExecutionStrategy strategy, TState state, Func2 操作) 在 Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerDatabaseCreator.Exists(布尔 retryOnNotExists) 在 Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerDatabaseCreator.Exists() 在 Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.Exists() 在 Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(字符串 targetMigration) 在 Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(字符串 targetMigration,字符串 connectionString,字符串 contextType) 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(字符串 targetMigration,字符串 connectionString,字符串 contextType) 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.c__DisplayClass0_0.<.ctor>b__0() 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(操作动作) ClientConnectionId:00000000-0000-0000-0000-000000000000 错误号:53,状态:0,类:20 建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)
在我的startup 文件中,我有以下内容:
namespace id
{
public class Startup
{
public IWebHostEnvironment Environment { get; }
public IConfiguration Configuration { get; }
public Startup(IWebHostEnvironment environment, IConfiguration configuration)
{
Environment = environment;
Configuration = configuration;
}
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
var connectionString = Configuration.GetConnectionString("DefaultConnection");
var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;
services.AddIdentityServer()
.AddTestUsers(Config.Users)
.AddConfigurationStore(options =>
{
options.ConfigureDbContext = builder => builder.UseSqlServer(connectionString,
sqlOptions => sqlOptions.MigrationsAssembly(migrationsAssembly));
})
.AddOperationalStore(options =>
{
options.ConfigureDbContext = builder => builder.UseSqlServer(connectionString,
sqlOptions => sqlOptions.MigrationsAssembly(migrationsAssembly));
})
.AddDeveloperSigningCredential();
services.AddControllersWithViews();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseStaticFiles();
app.UseIdentityServer();
app.UseAuthorization();
app.UseEndpoints(endpoints => endpoints.MapDefaultControllerRoute());
}
}
}
在我的appsettings.json 我有
"ConnectionStrings": {
"DefaultConnection": "Data Source=IdentityServer.db;"
}
当我转到 Sql Server Config 时。经理我有以下几点:
我正在我的项目中运行Microsoft.EntityFrameworkCore.SqlServer...
当我尝试更新我的数据库时出现该错误的原因是因为我没有设置它还是有特定的事情导致了这个?另外,有没有办法使用 SQL Server Express 而不是 SQL Server 来做我想做的事情?
【问题讨论】:
-
查看connectionstrings.com - 您的连接字符串非常奇怪,很可能是导致此错误的原因。它应该类似于
data source=YourMachine\SQLEXPRESS;initial catalog=YourDatabaseName;,然后您还需要指定数据库用户和密码(User ID、Pwd)或使用Integrated Security=SSPI;使用集成安全性(Windows 身份验证)。 -
所以
connectionstring我认为这将是在项目中创建的文件?所以你说的是connectionstring,我实际上要创建一个数据库? -
我可以执行以下操作:
"DefaultConnection": "Data Source=.\\SQLExpress;database=Test.IdentityServer4.EntityFramework;trusted_connection=yes;"吗?允许它创建一个名为Test.IdentityServer4.EntityFramework? 的数据库 -
我会尝试使用 更简单 的数据库名称 - 没有空格,没有点 - 只是一个简单的名称 -
IdentityServerDB或类似的名称。如果您使用的是 SQL Server Express,则无需处理文件 - 您只需定义要在 SQL Server 上创建和使用的数据库(按名称) - 让文件摆弄服务器。 -
感谢您的建议和解释,我现在明白了!非常感谢! :)
标签: c# sql-server entity-framework identityserver4