지정된 LocalDB 인스턴스 이름이 잘못되었습니다. 마이그레이션을 만들 수 있지만 실행할 수는 없습니다.
새로운 XAF Blazor 솔루션을 만들고이를 실행하여 데이터베이스를 만들 수있었습니다. 그런 다음 이 질문에 따라 데이터베이스 마이그레이션을 추가 했지만 패키지 관리자 내에서 마이그레이션을 실행하면
Microsoft.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SNI_PN11, error: 50 - Local Database Runtime error occurred. Specified LocalDB instance name is invalid.
)
---> System.ComponentModel.Win32Exception (0x89C5011B): Unknown error (0x89c5011b)
at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, 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.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
at Microsoft.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
at Microsoft.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at Microsoft.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at Microsoft.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry, SqlConnectionOverrides overrides)
at Microsoft.Data.SqlClient.SqlConnection.Open(SqlConnectionOverrides overrides)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerConnection.OpenDbConnection(Boolean errorsExpected)
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenInternal(Boolean errorsExpected)
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerDatabaseCreator.<>c__DisplayClass18_0.<Exists>b__0(DateTime giveUp)
at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.<>c__DisplayClass12_0`2.<Execute>b__0(DbContext c, TState s)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.Execute[TState,TResult](IExecutionStrategy strategy, TState state, Func`2 operation, Func`2 verifySucceeded)
at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.Execute[TState,TResult](IExecutionStrategy strategy, TState state, Func`2 operation)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerDatabaseCreator.Exists(Boolean retryOnNotExists)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerDatabaseCreator.Exists()
at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.Exists()
at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String connectionString, String contextType)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String connectionString, String contextType)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
ClientConnectionId:00000000-0000-0000-0000-000000000000
Error Number:-1983577829,State:0,Class:20
A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections.
(provider: SNI_PN11, error: 50 - Local Database Runtime error occurred. Specified LocalDB instance name is invalid.
)
이 질문은 마이그레이션을 만들기 전에 프로그램이 데이터베이스에 액세스 할 수 있기 때문에 SQL Server 연결에 대한이 질문과 중복되지 않습니다 .
[최신 정보]
코드는
using DevExpress.ExpressApp.EFCore.Updating;
using Microsoft.EntityFrameworkCore;
using DevExpress.Persistent.BaseImpl.EF.PermissionPolicy;
using DevExpress.Persistent.BaseImpl.EF;
using DevExpress.ExpressApp.Design;
using DevExpress.ExpressApp.EFCore.DesignTime;
using DevExpress.Persistent.Base;
using Microsoft.EntityFrameworkCore.Design;
namespace ExamBuddy.Module.BusinessObjects {
public class ExamBuddyContextInitializer : DbContextTypesInfoInitializerBase {
protected override DbContext CreateDbContext() {
var builder = new DbContextOptionsBuilder<ExamBuddyEFCoreDbContext>()
.UseSqlServer(@";");
return new ExamBuddyEFCoreDbContext(builder.Options);
}
}
public class ExamBuddyContextFactory : IDesignTimeDbContextFactory<ExamBuddyEFCoreDbContext>
{
public ExamBuddyEFCoreDbContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<ExamBuddyEFCoreDbContext>();
optionsBuilder.UseSqlServer(@"Integrated Security=SSPI;MultipleActiveResultSets=true;Pooling=false;Data Source=(localdb)\\mssqllocaldb;Initial Catalog=ExamBuddy;ConnectRetryCount=0;");
return new ExamBuddyEFCoreDbContext(optionsBuilder.Options);
}
}
[TypesInfoInitializer(typeof(ExamBuddyContextInitializer))]
public class ExamBuddyEFCoreDbContext : DbContext {
public ExamBuddyEFCoreDbContext(DbContextOptions<ExamBuddyEFCoreDbContext> options) : base(options) {
}
public DbSet<ModuleInfo> ModulesInfo { get; set; }
public DbSet<ModelDifference> ModelDifferences { get; set; }
public DbSet<ModelDifferenceAspect> ModelDifferenceAspects { get; set; }
public DbSet<PermissionPolicyRole> Roles { get; set; }
public DbSet<PermissionPolicyRoleBase> RolesBase { get; set; }
public DbSet<PermissionPolicyUser> Users { get; set; }
}
[최신 정보]
나는 Dev Express TypesInfoInitializer 속성을 주석 처리하려고 시도했지만 다음을 추가하려고 시도했지만 실행되지 않습니다 (오류가 발생하지 않음) 반면 IDesignTimeDbContextFactory 메서드에 오류를 넣으면 발생합니다
public class MigrationsContextFactory : IDbContextFactory<ExamBuddyEFCoreDbContext>
{
public ExamBuddyEFCoreDbContext CreateDbContext()
{
throw new Exception("In Migration Context");
var optionsBuilder = new DbContextOptionsBuilder<ExamBuddyEFCoreDbContext>();
optionsBuilder.UseSqlServer(@"Integrated Security=SSPI;MultipleActiveResultSets=true;Pooling=false;Data Source=(localdb)\\mssqllocaldb;Initial Catalog=ExamBuddy;ConnectRetryCount=0;");
return new ExamBuddyEFCoreDbContext(optionsBuilder.Options);
}
}
ExamBuddyContextFactory 메소드가 실행됩니다.
[최신 정보]
백 슬래시 1 개만 사용하도록 연결 문자열을 편집하면 Visual Studio 2019에서 다음 메시지가 표시됩니다.


따라서 마이그레이션은 연결 문자열에 이중 백 슬래시로 생성되지만 실행되지는 않습니다.
답변
예외 메시지가 문제를 알려줍니다.
지정된 LocalDB 인스턴스 이름이 잘못되었습니다.
유효하지 않은 부분은 C # 축어 문자열 리터럴(localdb)\\mssqllocaldb
내부의 이중 백 슬래시입니다.
optionsBuilder.UseSqlServer(
@"Data Source=(localdb)\\mssqllocaldb;Integrated Security=SSPI;MultipleActiveResultSets=true;Pooling=false;Initial Catalog=ExamBuddy;ConnectRetryCount=0;");
// ^ ^
실제 이름은 (localdb)\mssqllocaldb
(단일 백 슬래시)이므로이를 수정하거나 축어 문자열 prefix를 제거하십시오 @
.
이 모든 것은 표준 C # 문자열 규칙 일 뿐이며 특별히 논의 할 사항은 없습니다. 그럼 왜
마이그레이션을 만들 수 있지만 실행할 수 없습니까?
때문이다 Add-Migration
명령은 데이터베이스에 연결을 시도하지 않으며, 데이터베이스 연결은 게으르게 필요로 할 때, 따라서 잘못된 연결 문자열이 검출되지 않은 경우에만 초기화됩니다. 이 명령 DbContext
은 모델 에 액세스하기 위해 인스턴스 를 생성 해야하며 특정 데이터베이스 공급자 유형에 대해 컨텍스트를 구성해야합니다 (EF Core가 각 데이터베이스 공급자 유형에 대해 별도의 모델을 생성하기 때문). 실제 데이터베이스.
그러나 Update-Database
명령은 분명히 데이터베이스 연결과 Remove-Migration
마이그레이션이 이미 적용되었는지 확인해야하는 명령이 필요합니다. 이것이 이러한 명령이 Add-Migration
성공 하는 동안 실패하는 이유 입니다.
다음과 같은 가짜 잘못된 연결 문자열을 제공하여 쉽게 확인할 수 있습니다.
optionsBuilder.UseSqlServer("Blah")'
OP에서와 똑같은 동작을 관찰하십시오.