2017-02-20 9 views
1

Я создал проект ASP.NET Core, в IBM Bluemix и добавил соединение с Compose для MySQL MySQL databaseкак подключить ядро ​​asp.net в bluemix к Mysql перенести базу данных

Я клонированный проект от git на hub.jazz.com в Visual Studio 2015, и я хочу создать базу данных из контекста, который я создаю, но я не могу подключиться к базе данных.

using HunterViews.Domain.Entities; 
using System.Collections.Generic; 
using Microsoft.EntityFrameworkCore; 
using Microsoft.Extensions.Options; 

namespace HunterViews.Data 
{ 
    public class HunterViewsContext : DbContext 
    { 
     public HunterViewsContext(DbContextOptions<HunterViewsContext> options) : base(options) 
     { 
     } 

     public HunterViewsContext() 
     { 
     } 

     protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
     { 
     optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=HunterViewsCore;Trusted_Connection=true;"); 
     } 

     public DbSet<User> users { get; set; } 
     public DbSet<JobSeeker> jobseekers { get; set; } 
     public DbSet<HeadHunter> headHunters { get; set; } 
     public DbSet<Offer> offers { get; set; } 
     public DbSet<Post> posts { get; set; } 
     public DbSet<Skill> skills { get; set; } 
     public DbSet<Reclamation> reclamations { get; set; } 
     public DbSet<Evaluation> evaluations { get; set; } 
     public DbSet<Formation> formations { get; set; } 
     public DbSet<Notification> notifications { get; set; } 
     public DbSet<Certification> certifications { get; set; } 
    } 
}   

Итак, я хочу изменить optionsBuilder: optionsBuilder.UseSqlServer(@"Server(localdb)\mssqllocaldb;Database=HunterViewsCore;Trusted_Connection=true;");

использовать базу данных MySQL, который я создал на Bluemix для создания моей БД. Как я могу это сделать?

ответ

1

Чтобы использовать MySQL вместо SQL Server, вам необходимо включить в проект один из MySQL providers для Entity Framework Core. В Visual Studio 2015 это означает изменение файла project.json для включения зависимости. Какую зависимость вы добавляете, зависит от того, какой поставщик вы решите использовать. Например, если вы решите использовать SapientGuardian, вы бы добавить SapientGuardian.EntityFrameworkCore.MySql в dependencies разделе вашего project.json как так:

"dependencies": { 
    "SapientGuardian.EntityFrameworkCore.MySql": "7.1.19" 
} 

Стандарт конвенции для ASP.NET Сердечник сделать конфигурацию в Startup классе, но вы также можете настроить строку подключения к базе данных в своем DbContext, как вы это делаете в примере, который вы опубликовали. Чтобы настроить в Startup классе (предполагается, что строка соединения хранится в строковой переменной с именем connectionString, измените строку, где вы добавить DbContext к этому:

app.AddDbContext<HunterViewsContext>(options => options.UseMySQL(connectionString));

не делая, что вам больше не нужно переопределить метод OnConfiguring в вашем DbContext. Но если вы хотите использовать OnConfiguring в DbContext вместо этого, вы можете просто позвонить optionsBuilder.UseMySQL(connectionString) там вместо этого.

Теперь вот где он получает немного сложнее. Так как Compose услуги MySQL использовать само- сиг которые предоставляются в виде строки с кодировкой Base64, представляющей сертификат формата PEM, в переменной окружения VCAP_SERVICES, вам нужно будет преобразовать этот сертификат в формат PFX, прежде чем вы сможете использовать его с поставщиком MySQL.

У вас есть два варианта для этого преобразования. Первый вариант - использовать какой-то внешний инструмент для преобразования сертификата в формат PFX и нажать этот файл с вашим приложением. Другим решением является преобразование сертификата «на лету» при запуске приложения при настройке соединения с базой данных.

Вы можете использовать пакет BouncyCastle NuGet сделать преобразование на лету, как так:

private static void CreatePfxFromPemCertificate(string base64encodedPem, string pfxFilePath, string pfxPassword) 
    { 
     // get the PEM certificate, then convert to pfx format 
     byte[] bytes = Convert.FromBase64String(base64encodedPem); 
     Pkcs12Store store = new Pkcs12StoreBuilder().Build(); 
     X509CertificateEntry[] chain = new X509CertificateEntry[1]; 

     object pemObject; 
     using (var streamReader = new StreamReader(new MemoryStream(bytes))) 
     { 
      PemReader pemReader = new PemReader(streamReader); 
      if ((pemObject = pemReader.ReadObject()) is X509Certificate) 
      { 
       chain[0] = new X509CertificateEntry((X509Certificate)pemObject); 
      } 
     } 

     store.SetCertificateEntry(pfxFilePath, chain[0]); 
     var certFile = File.Create(pfxFilePath); 
     store.Save(certFile, pfxPassword.ToCharArray(), new SecureRandom()); 
     certFile.Flush(); 
     certFile.Dispose(); 
    } 

Эта функция будет требовать, чтобы эти заявления с помощью:

using Org.BouncyCastle.OpenSsl; 
using Org.BouncyCastle.Pkcs; 
using Org.BouncyCastle.Security; 
using Org.BouncyCastle.X509; 

И эта зависимость в проекте.JSON:

"Portable.BouncyCastle-Signed": "1.7.0.2", 

Эта функция принимает 3 параметра:

  1. кодировке base64 строку (представленную в переменной окружения VCAP_SERVICES)
  2. Путь к файлу PFX, который будет записан
  3. пароль, который должен использоваться для защиты файла pfx

Теперь, когда у нас есть функция, которая c конвертировать сертификат с кодировкой Base64, пришло время собрать все это вместе и создать строку соединения из переменной окружения VCAP_SERVICES в классе Startup.

Во-первых, в конструкторе Startup класса:

public Startup(IHostingEnvironment env) 
{ 
    var builder = new ConfigurationBuilder() 
     .SetBasePath(env.ContentRootPath) 
     .AddJsonFile("vcap-local.json", optional:true); // when running locally, store VCAP_SERVICES credentials in vcap-local.json 

    Configuration = builder.Build(); 

    // try to get the VCAP_SERVICES environment variable (when running on Bluemix) 
    string vcapServices = Environment.GetEnvironmentVariable("VCAP_SERVICES"); 
    if (vcapServices != null) 
    { 
     JObject json = JObject.Parse(vcapServices); 
     var credentialsToken = json.SelectToken("compose-for-mysql")? // look for compose-for-mysql instance 
       .FirstOrDefault()?     // get first database instance 
       .SelectToken("credentials");  // get the credentials 
     // get the uri 
     Configuration["compose-for-mysql:0:credentials:uri"] = credentialsToken?.SelectToken("uri"); 
     // get the base64 certificate 
     Configuration["compose-for-mysql:0:credentials:ca_certificate_base64"] = credentialsToken?.SelectToken("ca_certificate_base64"); 
    } 
} 

Этот код будет захватывать базы данных Ури из переменной в VCAP_SERVICES среды, или файл JSON называется vcap-local.json в директории проекта, если вы работаете на местном уровне (вы можете скопировать учетные данные со вкладки соединений в интерфейсе Bluemix).

Чтобы поместить это все вместе, чтобы создать строку базы данных в методе ConfigureServices в Startup классе:

public void ConfigureServices(IServiceCollection services) 
{ 
    var databaseUri = Configuration["compose-for-mysql:0:credentials:uri"]; 
    var username = (databaseUri.Split('/')[2]).Split(':')[0]; 
    var password = (databaseUri.Split(':')[2]).Split('@')[0]; 
    var port = (databaseUri.Split(':')[3]).Split('/')[0]; 
    var hostname = (databaseUri.Split('@')[1]).Split(':')[0]; 
    var database = databaseUri.Split('/')[3]; 

    // create the connection string 
    var connectionString = $"Server={hostname};Port={port};uid={username};pwd={password};Database={database};SSL Mode=Required;"; 

    // convert the Base64 encoded PEM SSL certificate to PFX format 
    CreatePfxFromPemCertificate(config[$"compose-for-mysql:0:credentials:ca_certificate_base64"], 
     "compose-for-mysql0.pfx", password); 

    // add the ssl certificate to the connection string 
    connectionString += "CertificateFile=compose-for-mysql0.pfx;"; 
    connectionString += $"CertificatePassword={password};"; 

    // add database context 
    services.AddDbContext<HunterViewsContext>(options => options.UseMySQL(connectionString)); 

    // Add framework services. 
    services.AddMvc(); 
} 
+0

Пожалуйста, используйте официальную портативную версию BouncyCastle, Portable.BouncyCastle. Я поддерживаю портативную вилку. Если у вас возникли проблемы, откройте проблему в репо: https://github.com/onovotny/bc-csharp –