Übergeben Sie die Verbindungszeichenfolge an Code-First DbContext

Wie übermittle ich eine Verbindungszeichenfolge an den Code-First DbContext des Entitätsframeworks? Meine databasegenerierung funktioniert ordnungsgemäß, wenn sich sowohl DbContext als auch die Verbindungszeichenfolge in web.config im selben Projekt befinden und auf die gleiche Weise benannt sind. Aber jetzt muss ich den DbContext in ein anderes Projekt verschieben, also teste ich wie folgt eine Verbindungszeichenfolge:

Modell und Kontext

public class Dinner { public int DinnerId { get; set; } public string Title { get; set; } } public class NerdDinners : DbContext { public NerdDinners(string connString) : base(connString) { } public DbSet Dinners { get; set; } } 

Aktion

  public ActionResult Index() { var db = new NerdDinners(ConfigurationManager.ConnectionStrings["NerdDinnerDb"].ConnectionString); var dinners = (from d in db.Dinners select d).ToList(); return View(dinners); } 

Web.Konfig

    

Wenn ich einen Haltepunkt in der Aktion einstelle und die database analysiere, ist die Verbindungszeichenfolge vorhanden, aber die database wird nicht erstellt oder gefunden.

Beim Herstellen einer Verbindung zu SQL Server ist ein netzwerkbezogener oder instanzspezifischer Fehler aufgetreten. Der Server wurde nicht gefunden oder war nicht erreichbar. Stellen Sie sicher, dass der Instanzname korrekt ist und dass SQL Server so konfiguriert ist, dass Remoteverbindungen zugelassen werden. (Anbieter: Named Pipes Provider, Fehler: 40 – Verbindung zu SQL Server konnte nicht hergestellt werden)

Ein bisschen spät zum Spiel hier, aber eine andere Option ist:

 public class NerdDinners : DbContext { public NerdDinners(string connString) { this.Database.Connection.ConnectionString = connString; } public DbSet Dinners { get; set; } } 

Nach dem Lesen der Dokumente muss ich stattdessen den Namen der Verbindungszeichenfolge übergeben:

 var db = new NerdDinners("NerdDinnerDb"); 

Ich dachte, ich würde dieses Bit für Leute hinzufügen, die nach “Wie übergebe ich eine Verbindungszeichenfolge an einen DbContext”: Sie können eine Verbindungszeichenfolge für den zugrunde liegenden Datenspeicher erstellen und die gesamte Verbindungszeichenfolge an den Konstruktor Ihres von DbContext abgeleiteten Typs übergeben .

(Wiederverwendung von Code aus @Lol Coder) Modell & Kontext

 public class Dinner { public int DinnerId { get; set; } public string Title { get; set; } } public class NerdDinners : DbContext { public NerdDinners(string connString) : base(connString) { } public DbSet Dinners { get; set; } } 

Angenommen, Sie erstellen eine SQL-Verbindungszeichenfolge mit dem SqlConnectioStringBuilder wie folgt:

 SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(GetConnectionString()); 

Wenn die GetConnectionString-Methode die entsprechende Verbindungszeichenfolge erstellt und SqlConnectionStringBuilder sicherstellt, dass die Verbindungszeichenfolge syntaktisch korrekt ist, Sie können dann Ihr db conetxt wie folgt instanziieren:

 var myContext = new NerdDinners(builder.ToString()); 

Erstellen Sie in Ihrem DbContext einen Standardkonstruktor für Ihren DbContext und erben Sie die Basis wie folgt:

  public myDbContext() : base("MyConnectionString") // connectionstring name define in your web.config { } 

Wenn Sie die Verbindungszeichenfolge in der App erstellen, verwenden Sie den Befehl connString. Wenn Sie eine Verbindungszeichenfolge in der Webkonfiguration verwenden. Dann verwenden Sie den “Namen” dieser Zeichenfolge.

Überprüfen Sie die Syntax Ihrer Verbindungszeichenfolge in der Datei web.config. Es sollte etwas wie ConnectionString="Data Source=C:\DataDictionary\NerdDinner.sdf"

Bei Verwendung eines EF-Modells habe ich in jedem Projekt, das das EF-Modell verwendet, eine Verbindungszeichenfolge. Zum Beispiel habe ich ein EF EDMX-Modell in einer separaten classnbibliothek. Ich habe eine Verbindungszeichenfolge in meinem Web (Mvc) Projekt, so dass es auf die EF db zugreifen kann.

Ich habe auch ein anderes Unit-Test-Projekt zum Testen der Repositories. Damit die Repositorys auf die EF-database zugreifen können, verfügt die Datei app.config des Testprojekts über dieselbe Verbindungszeichenfolge.

DB-Verbindungen sollten konfiguriert, nicht codiert, IMO sein.

Ich sehe nichts falsch mit Ihrem Code, ich benutze SqlExpress und es funktioniert gut, wenn ich eine Verbindungszeichenfolge im Konstruktor verwende.

Sie haben in Ihrem Projekt einen App_Data-Ordner erstellt, nicht wahr?

Ich habe ein kleines Lösungsbeispiel für dieses Problem.

MyDBContext.cs

  public MyDBContext(DBConnectionType ConnectionType) //: base("ConnMain") { if(ConnectionType==DBConnectionType.MainConnection) { this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnMain"].ConnectionString; } else if(ConnectionType==DBConnectionType.BackupConnection) { this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnBackup"].ConnectionString; } } 

Meineclass.cs

 public enum DBConnectionType { MainConnection=0, BackupConnection=1 } 

frmMyForm.cs

  MyDBContext db = new MyDBContext(DBConnectionType.MainConnection); //or //MyDBContext db = new MyDBContext(DBConnectionType.BackupConnection);