2017-11-24 1 views
4

마이그레이션과 함께 DB 연결 문자열을 처리하는 데 문제가 있습니다. 나는이 개 프로젝트가 :Entity Framework 핵심 마이그레이션 - 연결 문자열

  • 도메인

DbContext이 도메인 프로젝트에

  • 응용 프로그램, 그래서 이것은 내가에 대한 마이그레이션을 실행하는 프로젝트입니다. 마이 그 레이션 개념은 데이터베이스 공급자, 예를 들어 내 DbContextOnConfiguring를 구현하고 거기에 지정하는 날을 적용 :

    protected override void OnConfiguring(DbContextOptionsBuilder builder) 
    { 
        builder.UseSqlServer("<connection string>"); 
    } 
    

    내 문제는 내가 분명한 이유를 들어, 하드 코드 된 연결 문자열을 사용하지 않도록하고 구성 파일이 응용 프로그램 프로젝트에 있기 때문에 ConfigurationManager를 사용하여 구성 파일에서 읽을 수는 없습니다.

  • 답변

    0

    동일한 문제가 있었으며 해결 방법이 있습니다. :)

    구현해야합니다. IDbContextFactory<TContext> 이렇게하면 appsettings.json에서 연결 문자열을 읽을 수 있습니다. OnConfigure() 덮어 쓰기가 더 이상 사용되지 않기 때문에 오류없이 Add-Migration을 사용할 수도 있습니다.

    샘플 구현 :

    public class DomainContextFactory : IDbContextFactory<DomainContext> 
    { 
        public string BasePath { get; protected set; } 
    
        public DomainContext Create() 
        { 
         var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); 
    
         var basePath = AppContext.BaseDirectory; 
    
         return Create(basePath, environmentName); 
        } 
    
        public DomainContext Create(DbContextFactoryOptions options) 
         => Create(options.ContentRootPath, options.EnvironmentName); 
    
        private DomainContext Create(string basePath, string environmentName) 
        { 
         BasePath = basePath; 
         var configuration = Configuration(basePath, environmentName); 
         var connectionString = ConnectionString(configuration.Build()); 
         return Create(connectionString); 
        } 
    
        private DomainContext Create(string connectionString) 
        { 
         if (string.IsNullOrEmpty(connectionString)) 
         { 
          throw new ArgumentException($"{nameof(connectionString)} is null or empty", nameof(connectionString)); 
         } 
         var optionsBuilder = new DbContextOptionsBuilder<DomainContext>(); 
         return Configure(connectionString, optionsBuilder); 
        } 
    
        protected virtual IConfigurationBuilder Configuration(string basePath, string environmentName) 
        { 
         var builder = new ConfigurationBuilder() 
          .SetBasePath(basePath) 
          .AddJsonFile("constr.json") 
          .AddJsonFile($"constr.{environmentName}.json", true) 
          .AddEnvironmentVariables(); 
         return builder; 
        } 
    
        protected virtual string ConnectionString(IConfigurationRoot configuration) 
        { 
         string connectionString = configuration["ConnectionStrings:DefaultConnection"]; 
         return connectionString; 
        } 
    
        protected virtual DomainContext Configure(string connectionString, DbContextOptionsBuilder<DomainContext> builder) 
        { 
         builder.UseSqlServer(connectionString, opt => opt.UseRowNumberForPaging()); 
    
         DomainContext db = new DomainContext(builder.Options); 
         return db; 
        } 
    
    
        DomainContext IDbContextFactory<DomainContext>.Create(DbContextFactoryOptions options) 
         => Create(options.ContentRootPath, options.EnvironmentName); 
    } 
    

    우리는 그것을 사용하는 방법 :

    public override IServiceResult<IList<Datei>> LoadAllData() 
        { 
         using (var db = this.DomainContextFactory.Create()) 
         { 
          var files = db.Datei 
           .ToListAsync<Datei>(); 
    
          return new ServiceResult<IList<Datei>>(files.Result, files.Result.Count); 
         } 
        } 
    

    샘플 설정

    { 
        "ConnectionStrings": { 
        "DefaultConnection": "Put your connectionstring here" 
        } 
    } 
    
    관련 문제