2016-08-18 1 views
1

Ich habe eine Datenbank mit PostgreSQL bauen, die ich durch Entity Framework zugreifen 6.außerhalb der app.config eine Connection für eine PostgreSQL-Datenbank in Entity Framework Set

Bis vor kurzem es glatt durch eine app.config Connection lief:

<connectionStrings> 
    <add 
     name="fancyName" 
     connectionString="Host=localhost; user id=allCanSee; password=notSoSecret; database=notHidden" 
     providerName="Npgsql" /> 
</connectionStrings> 

Unser führender Programmierer ist nicht glücklich über einen offenen connectionString, da jeder Computer, auf dem wir die Software installieren, es lesen kann. Wir haben daher alles verschlüsselt und die Verschlüsselung im app.config gespeichert.

Jetzt habe ich ein neues Problem - ich meine Datenbank die folgende Art und Weise zugegriffen haben:

public class VersionContext 
{ 
    public virtual DbSet<DatabaseNumber> DatabaseVersion { get; set; } 

    public VersionContext() : base("name=fancyName") 
    { 
     System.Data.Entity.Database.SetInitializer<DatabaseContext>(null); 
    } 
} 

Aber da meine app.config nicht mehr die Connectionstring enthält, muss ich die Datenbank sagen, wo zu suchen.

Mein aktueller Versuch ist so etwas wie dieses:

public static class VersionContextConnection 
{ 
    public static string GetConnectionString() //Accessable form everywhere 
    { 
     var providerName = "Npgsql"; 
     var databaseName = decryptedName; 
     var userName = decryptedUserName; 
     var password = decryptedPassword; 
     var host = decryptedHostName 
     var port = 5432; 

     return $"Provider={providerName}; " + $"Server={host}; " + $"Port={port}; " + 
      $"User Id={userName}; " + $"Password={password}; " + $"Database={databaseName};"; 
    } 
} 

public class VersionContext : DbContext 
{ 
    public virtual DbSet<DatabaseNumber> DatabaseVersion { get; set; } 

    public VersionContext() : base(VersionContextConnection.GetConnectionString()) 
    { 
     System.Data.Entity.Database.SetInitializer<DatabaseContext>(null); 
    } 
} 

Dann würde ich es wie folgt zugreifen:

using (var context = new VersionContext()) 
{ 
    var entry = context.DatabaseVersion.FirstOrDefault(); 
    ... 
} 

Aber das gibt eine Ausnahme von System.Data sagen Keyword not supported: 'provider'.

provider Entfernen von der connectionString gibt eine weitere Ausnahme: Keyword not supported: 'port'.

port aus der Connection Entfernen gibt eine dritte Ausnahme von .Net SqlClient Data Provider: Login failed for user 'secretSecret'.

So - wie richte ich meine Connection, wenn es durch die :base(connectionString) Eigenschaft nicht festgelegt ist?

+0

Was ist mit der Einstellung zur Laufzeit? etwas wie das? http://stackoverflow.com/questions/360024/how-do-i-set-a-connection-string-config-programatical-in-net – Forlani

+0

@ Forlani Das ist eine Lösung, aber dann das Passwort und Benutzername würde ausgesetzt werden zur Laufzeit ... –

Antwort

5

Eine Lösung ergab sich aus this answer.

Die app.config enthält die Anbieter:

public static class VersionContextConnection 
{ 
    public static DbConnection GetDatabaseConnection() 
    { 
     var providerName = "Npgsql"; //Get this 
     var databaseName = decryptedDatabaseName; 
     var userName = decryptedUserName; 
     var password = decryptedPassword; 
     var host = decryptedHostName 
     var port = 5432; 

     //Insert it here 
     var conn = DbProviderFactories.GetFactory(providerName).CreateConnection(); 
     conn.ConnectionString = $"Server={host}; " + $"Port={port}; " + 
      $"User Id={userName};" + $"Password={password};" + $"Database={databaseName};"; 

     return conn; 
    } 
} 

Stellen Sie die DbContext als solche:

public class VersionContext : DbContext 
{ 
    public virtual DbSet<DatabaseNumber> DatabaseVersion { get; set; } 

    public VersionContext() : base(VersionContextConnection.GetDatabaseConnection(), true) 
    { 
     System.Data.Entity.Database.SetInitializer<DatabaseContext>(null); 
    } 
} 

<providers> 
    <provider 
     invariantName="Npgsql" <!-- this is what we need --> 
     type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" /> 
</providers> 

Durch den Code, dass verweisen zu lassen, kann er die Verbindung erstellen

Und rufen Sie Ihren Code:

using (var context = new VersionContext()) 
{ 
    var entry = context.DatabaseVersion.FirstOrDefault(); 
    ... 
} 

Mit einer solchen, können Sie Ihre app.config mit verschlüsselten Login-Parameter füllen, rufen sie, und übergeben sie an Ihre DbContext.

+1

cool! Jeden Tag lernen wir hier etwas Neues. Gut gemacht – Forlani

1

Sie können versuchen, mit EntityConnectionStringBuilder:

Ändern Sie bitte Ihre statische Methode:

public static string GetConnectionString() //Accessable form everywhere 
{ 
     var providerName = "Npgsql"; 
     var databaseName = decryptedName; 
     var userName = decryptedUserName; 
     var password = decryptedPassword; 
     var host = decryptedHostName; 
     var port = 5432; 

     // Initializing the connection string builder for the provider 
     SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder(); 
     sqlBuilder.ConnectionString = String.Format("Host={0};user id={1},password={2},database={3}", 
     host, userName, password, databaseName); 

     // Initialize the EntityConnectionStringBuilder. 
     EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); 
     entityBuilder.Provider = providerName; 
     entityBuilder.ProviderConnectionString = sqlBuilder.ToString(); 

     return entityBuilder.ToString(); 
} 

und die Verwendung von Aussagen hinzu: using System.Data.SqlClient; und using System.Data.EntityClient; By the way, wird Port unterstützt? In der connectionString, die Sie zuerst angezeigt haben, gibt es keinen Portparameter.

+0

oder vielleicht, sollte es Server: Port sein? anstelle von Server; Port? – Forlani

+0

Ich habe das vor einiger Zeit versucht, @Forlani, aber es führte auch zu einer Ausnahme wo es sagte, dass es '' metadata'' in '' entityBuilder'' fehlte. Ich habe keine Metadaten zu geben, und was ich versuchte, führte zu mehr Ausnahmen, die npgsql nicht verwendet, um zu verbinden. Ich habe jedoch eine Lösung gefunden (siehe Thread). –

Verwandte Themen