2016-08-15 3 views
2

Я переношу проект ASP.NET в ASP.NET Core, и я пытался реализовать функциональность DbContext в .NET Core. Я пытаюсь передать различные данные SQL Server в optionsBuilder, который я передаю как параметр базовому конструктору. У меня есть следующий контекст класс модели:Как передать текст appsettings.json в виде строки подключения SQL в классе модели? (Конкретный пример)

public partial class CompanyFormsContext : DbContext 
{ 
     public CompanyFormsContext() : base (CreateOptions(null)) 
     {} 

     public CompanyFormsContext(string connName) : base (CreateOptions(connName)) 
     {} 

     //NEED TO CONNECT CONFIGURATION HERE 
     private static DbContextOptions<CompanyFormsContext> CreateOptions(string connName) 
     { 
      var optionsBuilder = new DbContextOptionsBuilder<CompanyFormsContext>(); 

      if (connName == null) 
      { 
       optionsBuilder.UseSqlServer("Server=(localdb)\\projectsv13;Database=coforms;Trusted_Connection=True;"); 
      } 
      else 
      { 
       //THIS IS HOW IM TRYING TO MAKE IT 
       //similar to --> Configuration["Data:CompanyFormsContext:ConnectionString"]" 
       optionsBuilder.UseSqlServer(Configuration["Data:" + connName + ":ConnectionString"]); 
      } 

      return optionsBuilder.Options; 
     } 
... 

Я хочу передать в моей информации SQL Server с помощью информации в appsettings.json которая заключается в следующем:

"Data": { 
    "CompanyFormsContext": { 
     "ConnectionString": "Server=(localdb)\\projectsv13;Database=coforms;Trusted_Connection=True;" 
    }, 
    "CompanyFormsContextQA": { 
     "ConnectionString": "Server=(localdb)\\projectsv13;Database=coforms;Trusted_Connection=True;" 
    } 
    }, 

Я нашел следующий вопрос, но я считаю, синтаксис немного изменился с момента обновления RC2, потому что я не могу использовать решения, или я делаю это неправильно.

Setting the SQL connection string for ASP.NET 5 web app in Azure

Как я мог бы использовать синтаксис, похожий на Configuration["Data:CompanyFormsContext:ConnectionString"] для входа SQL Server? Или есть лучший способ сделать это? Что конкретно должно быть в файле автозагрузки? У меня есть следующие:

public Startup(IHostingEnvironment env) 
{ 
    var builder = new ConfigurationBuilder() 
       .SetBasePath(env.ContentRootPath) 
       .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
       .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) 
       .AddEnvironmentVariables(); 
    Configuration = builder.Build(); 
} 

public IConfigurationRoot Configuration { get; set; } 

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddMvc(); 
    services.AddOptions(); 
} 
... 

При необходимости, я могу упростить вопрос конкретно спросить об использовании appsettings.json в классе модели. Я понимаю, что у меня есть дополнительная информация для разъяснения конкретной ситуации.

+0

Извините, я этого не понял, чего вы точно хотите? – Hamed

+0

Я обновил свой вопрос, я пытаюсь реализовать Configuration ["Data: CompanyFormsContext: ConnectionString"] в optionsBuilder в классе Model, CompanyFormsContext: DbContext –

ответ

4

Решение 1

Вы пытаетесь загрузить другую среду для контроля качества? Если да, то вы должны использовать переменную среды в свойствах проекта под названием:

ASPNETCORE_ENVIRONMENT : Development 

или

ASPNETCORE_ENVIRONMENT : QA 

Затем измените launchSettings.json:

{ 
    ... 
    "profiles": { 
    "IIS Express": { 
     "commandName": "IISExpress", 
     "launchBrowser": true, 
     "environmentVariables": { 
     "ASPNETCORE_ENVIRONMENT": "Development" 
     } 
    }, 
    "IIS Express (QA)": { 
     "commandName": "IISExpress", 
     "launchBrowser": true, 
     "environmentVariables": { 
     "ASPNETCORE_ENVIRONMENT": "QA" 
     } 
    } 
    } 
} 

Вы можете создать отдельный запуск .cs для каждой среды под названием StartupDevelopment.cs и StartupQA.cs. Это позволит использовать разные профили запуска, основанные на среде.

Решение 2

Вы пытаетесь загрузить отдельные строки соединения на основе контекста (различные контексты в вашей нагрузке приложения различных соединений)? Если это так:

Лучший способ сделать это - не использовать контекст для инициализации соединения. Это должно быть сделано в методе ConfigureServices в Startup.cs. Вы можете настроить свои строки соединения на основе ключа в ваших JSon файлах:

// This method gets called by the runtime. Use this method to add services to the container. 
public void ConfigureServices(IServiceCollection services) 
{ 
    // Load the first connection string 
    var connectionStringA = Configuration["Data:DefaultConnection:ConnectionStringA"]; 
    // Load the second connection string 
    var connectionStringB = Configuration["Data:DefaultConnection:ConnectionStringB"]; 
    // Set up Entity Framework 
    services.AddEntityFramework() 
     .AddSqlServer() 
     .AddDbContext<ContextA>(options => options.UseSqlServer(connectionStringA)) 
     .AddDbContext<ContextB>(options => options.UseSqlServer(connectionStringB)); 
} 

Теперь ваши контексты загрузят строки подключения из JSON файлов правильно.

+0

Я искал это, но решение 2 точно! Как я могу вызвать connectionStringA и connectionStringB из класса модели? –

+0

На самом деле я ищу решение 2, но я хочу использовать тот же класс Context с diffirent connectionStrings, поэтому я хочу иметь возможность сделать это 'Configuration [" Data: DefaultConnection: ConnectionStringA "];' в моем классе модели –

+0

I обновили мой вопрос, может быть, теперь стало яснее. –

Смежные вопросы