2017-12-01 9 views
1

IdentityServer4 2.0.2를 사용 중이고 QuickStart tutorial에 따라 Entity Framework Core를 사용했습니다. 기본 스키마 (dbo)에서 SQL Server의 사용자 지정 스키마로 변경하려고합니다. 다음 코드는 "idsrv4"스키마에서 테이블을 찾도록 DbContexts에 지시하여 올바르게 작동합니다. 내 개발 환경에서 IdentityServer4 Entity Framework 핵심 마이그레이션을위한 스키마는 어떻게 지정합니까?

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc(); 

    var identityConnectionString = Configuration.GetConnectionString("Identity"); 
    var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name; 

    services.AddIdentityServer() 
     .AddDeveloperSigningCredential() 
     .AddTestUsers(Config.GetUsers()) 
     .AddConfigurationStore(options => 
     { 
      options.DefaultSchema = "idsrv4"; 
      options.ConfigureDbContext = builder => builder.UseSqlServer(identityConnectionString, 
       sql => sql.MigrationsAssembly(migrationsAssembly)); 

     }) 
     .AddOperationalStore(options => 
     { 
      options.DefaultSchema = "idsrv4"; 
      options.ConfigureDbContext = builder => builder.UseSqlServer(identityConnectionString, 
       sql => sql.MigrationsAssembly(migrationsAssembly));      
     }); 
} 

, 나는 다음과 같은 코드로 Startup.cs의 구성() 메소드에서 데이터베이스를 초기화하고 있습니다 :

var context = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>(); 
context.Database.Migrate(); 

문제를 테이블이 여전히에서 생성되는 것을 dbo 스키마 Migrate() 메서드 (Microsoft.EntityFrameworkCore)에서 제공 한 스키마를 사용하도록 지시하려면 어떻게합니까? 여기

+0

마이그레이션을 만들기 전에'DefaultSchema' *를 설정 했습니까? –

+0

수동으로 마이그레이션을 만들지 않았습니다. 방금 Migrate()를 호출하고 데이터베이스가 만들어졌습니다. 테스트를 위해 데이터베이스를 삭제하고 앱을 다시 실행합니다. context.Database.Migrate() 메서드 호출에 도달하면 데이터베이스를 만듭니다. 어딘가에서 코딩 된 마이그레이션을 찾아야합니까? 프로젝트에 Migrations 폴더가 없습니다. NuGet 패키지에있는 EF 모델로 작업하는 것은 새로운 영역입니다. – LJFraney

+0

에서 [워드 프로세서] (https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.relationaldatabasefacadeextensions.migrate?view=efcore-2.0#Microsoft_EntityFrameworkCore_RelationalDatabaseFacadeExtensions_Migrate_Microsoft_EntityFrameworkCore_Infrastructure_DatabaseFacade_) Migrate' *이 보류 상태 마이그레이션을 적용한다는' 데이터베이스 컨텍스트에 대한. 이미 존재하지 않으면 데이터베이스를 만듭니다. *. 이것은'dbo'를 사용하도록 이미 설정된 어딘가에서 마이그레이션 클래스를 가져야한다고 생각합니다. –

답변

0

내가 닷넷 코어 1.1 IdentityServer4 1.x에서

추가 appsettings.json 내 구성에 대한 섹션을 위해 일을 가지고하는 방법입니다.

"IdentityServerConfig": { 
    "DBConfig": { 
     "IdentityServer": "Data Source=dbservername.database.windows.net;User ID=user_Name;Password=password;Initial Catalog=DBNAme;", 
     "DefaultSchema": "IDSVR" 
    }, 
    "CertificateConfig": { 
     "Thumbprint": "", 
     "FileName": "cert.pfx", 
     "SubDirectory": "", 
     "PassPhrase": "password" 
    }, 
    "RaiseErrorEvents": true, 
    "RaiseFailureEvents": true, 
    "RaiseInformationEvents": true, 
    "RaiseSuccessEvents": true 
    } 

IdentityServer의 구성 설정을위한 클래스가 생성되었습니다.

public class IdentityServerConfig 
    { 
     public CertificateConfig CertificateConfig { get; set; } 
     public DBConfig DBConfig { get; set; } 

     public bool RaiseErrorEvents { get; set; } 
     public bool RaiseFailureEvents { get; set; } 
     public bool RaiseInformationEvents { get; set; } 
     public bool RaiseSuccessEvents { get; set; } 
    } 

public void ConfigureServices(IServiceCollection services) 
{ 
    ...Other Code 

    var identityServerConfig = config.GetSection("IdentityServerConfig").Get<IdentityServerConfig>(); 


    var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name; 


    builder = services.AddIdentityServer(options => 
      { 
       options.Events.RaiseErrorEvents = identityServerConfig.RaiseErrorEvents ; 
       options.Events.RaiseFailureEvents = identityServerConfig.RaiseFailureEvents ; 
       options.Events.RaiseInformationEvents = identityServerConfig.RaiseInformationEvents ; 
       options.Events.RaiseSuccessEvents = identityServerConfig.RaiseSuccessEvents ; 
      }) 

    .AddConfigurationStore(
        b => b.UseSqlServer(identityServerConfig.DBConfig.IdentityServer , 
        options => 
        { 
         options.MigrationsAssembly(migrationsAssembly); 
        }), storeOption => 
        { 
         storeOption.DefaultSchema = identityServerConfig.DBConfig.DefaultSchema ;//IDSVR 
        }) 
    .AddOperationalStore(
       b => b.UseSqlServer(identityServerConfig.DBConfig.IdentityServer, 
       options => options.MigrationsAssembly(migrationsAssembly) 
       ), storeOption => storeOption.DefaultSchema = identityServerConfig.DBConfig.DefaultSchema //IDSVR 
       ); 
} 
+0

당신은 2.0을 사용하고 있습니까? " 'ConfigurationStoreOptions'에 'UseSqlServer'에 대한 정의가 없습니다." 이것은 다른 곳에서 본 것과 같은 해결책이지만 2.0에 차이가 있다고 추측합니다. – LJFraney

+0

.Net Core 1.1을 사용 중입니다. – aaronR

+0

'ConfigurationStoreOptions'은 'AddConfigurationStore()'의 매개 변수입니다. – aaronR