Teilen über


Verbindungszeichenfolgen und Modelle

In diesem Thema wird erläutert, wie Entity Framework ermittelt, welche Datenbankverbindung verwendet werden soll und wie Sie diese ändern können. Dabei werden Modelle behandelt, die mit Code First und mit EF Designer erstellt wurden.

In der Regel verwendet eine Entity Framework-Anwendung eine von DbContext abgeleitete Klasse. Diese abgeleitete Klasse ruft einen der Konstruktoren in der DbContext-Basisklasse auf, um Folgendes zu steuern:

  • Wie der Kontext eine Verbindung mit einer Datenbank herstellt, d. h., wie eine Verbindungszeichenfolge ermittelt/verwendet wird
  • Ob der Kontext ein Modell mithilfe von Code First berechnet oder ein Modell lädt, das mit dem EF Designer erstellt wurde
  • Weitere erweiterte Optionen

Die folgenden Fragmente zeigen einige der Möglichkeiten, wie DbContext-Konstruktoren verwendet werden können.

Verwenden von Code First mit einer Verbindung nach Konvention

Wenn Sie keine andere Konfiguration in Ihrer Anwendung vorgenommen haben, führt das Aufrufen des parameterlosen Konstruktors in DbContext dazu, dass DbContext im Code First-Modus mit einer Datenbankverbindung ausgeführt wird, die nach Konvention erstellt wurde. Beispiel:

namespace Demo.EF
{
    public class BloggingContext : DbContext
    {
        public BloggingContext()
        // C# will call base class parameterless constructor by default
        {
        }
    }
}

In diesem Beispiel verwendet DbContext den per Namespace qualifizierten Namen der abgeleiteten Kontextklasse „Demo.EF.BloggingContext“ als Datenbanknamen und erstellt eine Verbindungszeichenfolge für diese Datenbank mit SQL Express oder LocalDB. Wenn beide installiert sind, wird SQL Express verwendet.

Visual Studio 2010 enthält SQL Express standardmäßig, während Visual Studio 2012 und höher LocalDB enthält. Während der Installation überprüft das EntityFramework-NuGet-Paket, welcher Datenbankserver verfügbar ist. Das NuGet-Paket aktualisiert dann die Konfigurationsdatei, indem der Standarddatenbankserver festgelegt wird, der bei Code First für das Erstellen einer Verbindung nach Konvention verwendet wird. Wenn SQL Express ausgeführt wird, wird es verwendet. Wenn SQL Express nicht verfügbar ist, wird stattdessen LocalDB als Standard registriert. An der Konfigurationsdatei selbst werden keine Änderungen vorgenommen, wenn sie bereits eine Einstellung für die Standardverbindungsfactory enthält.

Verwenden von Code First mit einer Verbindung nach Konvention und angegebenem Datenbanknamen

Wenn Sie in Ihrer Anwendung keine abweichende Konfiguration vorgenommen haben, führt das Aufrufen des Zeichenfolgenkonstruktors für DbContext mit dem gewünschten Datenbanknamen dazu, dass DbContext im Code First-Modus mit einer Datenbankverbindung ausgeführt wird, die nach der Konvention für die Datenbank dieses Namens erstellt wurde. Beispiel:

public class BloggingContext : DbContext
{
    public BloggingContext()
        : base("BloggingDatabase")
    {
    }
}

In diesem Beispiel verwendet DbContext „BloggingDatabase“ als Datenbanknamen und erstellt eine Verbindungszeichenfolge für diese Datenbank mithilfe von SQL Express (installiert mit Visual Studio 2010) oder LocalDB (installiert mit Visual Studio 2012). Wenn beide installiert sind, wird SQL Express verwendet.

Verwenden von Code First mit einer Verbindungszeichenfolge in der Datei „app.config“ bzw. „web.config“

Sie können eine Verbindungszeichenfolge in der Datei „app.config“ oder „web.config“ hinzufügen. Beispiel:

<configuration>
  <connectionStrings>
    <add name="BloggingCompactDatabase"
         providerName="System.Data.SqlServerCe.4.0"
         connectionString="Data Source=Blogging.sdf"/>
  </connectionStrings>
</configuration>

Dies stellt eine einfache Möglichkeit dar, DbContext anzuweisen, einen anderen Datenbankserver als SQL Express oder LocalDB zu verwenden. Im obigen Beispiel wird eine SQL Server Compact Edition-Datenbank angegeben.

Wenn der Name der Verbindungszeichenfolge mit dem Namen Ihres Kontexts übereinstimmt (entweder mit oder ohne Namespacequalifizierung), wird er von DbContext gefunden, sofern der parameterlose Konstruktor verwendet wird. Wenn sich der Name der Verbindungszeichenfolge vom Namen des Kontexts unterscheidet, können Sie DbContext anweisen, diese Verbindung im Code First-Modus zu verwenden, indem Sie den Namen der Verbindungszeichenfolge an den DbContext-Konstruktor übergeben. Beispiel:

public class BloggingContext : DbContext
{
    public BloggingContext()
        : base("BloggingCompactDatabase")
    {
    }
}

Alternativ können Sie „name=<Verbindungszeichenfolgenname>“ als die an den DbContext-Konstruktor übergebene Zeichenfolge verwenden. Beispiel:

public class BloggingContext : DbContext
{
    public BloggingContext()
        : base("name=BloggingCompactDatabase")
    {
    }
}

Diese Zeichenfolge gibt explizit an, dass Sie erwarten, dass die Verbindungszeichenfolge in Ihrer Konfigurationsdatei gefunden wird. Wenn keine Verbindungszeichenfolge mit dem angegebenen Namen gefunden wurde, wird eine Ausnahme ausgelöst.

Database/Model First mit einer Verbindungszeichenfolge in der Datei „app.config“ bzw. „web.config“

Modelle, die mit dem EF Designer erstellt wurden, unterscheiden sich vom Code First-Modus darin, dass Ihr Modell bereits vorhanden ist und nicht bei Ausführung der Anwendung aus Code generiert wird. Das Modell ist in der Regel als EDMX-Datei in Ihrem Projekt enthalten.

Der Designer fügt Ihrer Datei „app.config“ oder „web.config“ eine EF-Verbindungszeichenfolge hinzu. Dies ist eine spezielle Verbindungszeichenfolge, die Informationen zum Ermitteln der Informationen in Ihrer EDMX-Datei enthält. Beispiel:

<configuration>  
  <connectionStrings>  
    <add name="Northwind_Entities"  
         connectionString="metadata=res://*/Northwind.csdl|  
                                    res://*/Northwind.ssdl|  
                                    res://*/Northwind.msl;  
                           provider=System.Data.SqlClient;  
                           provider connection string=  
                               &quot;Data Source=.\sqlexpress;  
                                     Initial Catalog=Northwind;  
                                     Integrated Security=True;  
                                     MultipleActiveResultSets=True&quot;"  
         providerName="System.Data.EntityClient"/>  
  </connectionStrings>  
</configuration>

Der EF Designer generiert auch Code, der DbContext anweist, diese Verbindung zu verwenden. Dazu wird der Verbindungszeichenfolgenname an den DbContext-Konstruktor übergeben. Beispiel:

public class NorthwindContext : DbContext
{
    public NorthwindContext()
        : base("name=Northwind_Entities")
    {
    }
}

DbContext weiß, dass das vorhandene Modell geladen werden soll (anstatt Code First zu verwenden, um es aus Code zu berechnen), da es sich bei der Verbindungszeichenfolge um eine EF-Verbindungszeichenfolge handelt, die Details zum zu verwendenden Modell enthält.

Andere Optionen für den DbContext-Konstruktor

Die DbContext-Klasse enthält weitere Konstruktoren und Verwendungsmuster, die einige komplexere Szenarien ermöglichen. Hierzu zählen beispielsweise die folgenden:

  • Sie können die DbModelBuilder-Klasse verwenden, um ein Code First-Modell zu erstellen, ohne eine DbContext-Instanz instanziieren zu müssen. Das Ergebnis ist ein DbModel-Objekt. Sie können dieses DbModel-Objekt dann an einen der DbContext-Konstruktoren übergeben, wenn Sie bereit sind, Ihre DbContext-Instanz zu erstellen.
  • Sie können auch eine vollständige Verbindungszeichenfolge anstelle des Datenbank- oder Verbindungszeichenfolgennamens an DbContext übergeben. Standardmäßig wird diese Verbindungszeichenfolge mit dem System.Data.SqlClient-Anbieter verwendet. Dieses Verhalten können Sie aber ändern, indem Sie eine andere Implementierung von IConnectionFactory auf context.Database.DefaultConnectionFactory festlegen.
  • Sie können ein vorhandenes DbConnection-Objekt verwenden, indem Sie es an einen DbContext-Konstruktor übergeben. Wenn das Verbindungsobjekt eine Instanz von EntityConnection ist, wird das in der Verbindung angegebene Modell verwendet, anstatt per Code First ein Modell zu berechnen. Wenn es sich bei dem Objekt um eine Instanz eines anderen Typs handelt (z. B. SqlConnection), verwendet der Kontext diesen für den Code First-Modus.
  • Sie können einen vorhandenen ObjectContext an einen DbContext-Konstruktor übergeben, um einen DbContext-zu erstellen, der den vorhandenen Kontexts umschließt. Dies kann für vorhandene Anwendungen genutzt werden, die ObjectContext verwenden, aber DbContext in einigen Teilen der Anwendung nutzen möchten.