Verbindungs Zeichenfolgen und ModelleConnection strings and models

In diesem Thema wird erläutert, wie Entity Framework ermittelt, welche Datenbankverbindung verwendet werden soll, und wie Sie Sie ändern können.This topic covers how Entity Framework discovers which database connection to use, and how you can change it. Die Modelle, die mit Code First und dem EF-Designer erstellt wurden, werden in diesem Thema behandelt.Models created with Code First and the EF Designer are both covered in this topic.

In der Regel verwendet eine Entity Framework Anwendung eine von dbcontext abgeleitete Klasse.Typically an Entity Framework application uses a class derived from DbContext. Diese abgeleitete Klasse ruft einen der Konstruktoren für die Basisklasse "dbcontext" auf, um Folgendes zu steuern:This derived class will call one of the constructors on the base DbContext class to control:

  • Wie der Kontext eine Verbindung mit einer Datenbank herstellt – d. h., wie eine Verbindungs Zeichenfolge gefunden bzw. verwendet wirdHow the context will connect to a database — that is, how a connection string is found/used
  • Ob der Kontext das Berechnen eines Modells mithilfe von Code First oder das Laden eines Modells verwendet, das mit dem EF-Designer erstellt wurdeWhether the context will use calculate a model using Code First or load a model created with the EF Designer
  • Weitere Erweiterte OptionenAdditional advanced options

Die folgenden Fragmente zeigen einige Möglichkeiten, wie die dbcontext-Konstruktoren verwendet werden können.The following fragments show some of the ways the DbContext constructors can be used.

Code First mit Verbindung nach Konvention verwendenUse Code First with connection by convention

Wenn Sie in der Anwendung keine andere Konfiguration ausgeführt haben, führt das Aufrufen des Parameter losen Konstruktors in dbcontext dazu, dass dbcontext im Code First Modus mit einer Datenbankverbindung ausgeführt wird, die von der Konvention erstellt wurde.If you have not done any other configuration in your application, then calling the parameterless constructor on DbContext will cause DbContext to run in Code First mode with a database connection created by convention. Beispiel:For example:

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

In diesem Beispiel verwendet dbcontext den qualifizierten Namespace Namen ihrer abgeleiteten Kontext Klasse – Demo. EF. bloggingcontext – als Datenbanknamen und erstellt eine Verbindungs Zeichenfolge für diese Datenbank mithilfe von SQL Express oder localdb.In this example DbContext uses the namespace qualified name of your derived context class—Demo.EF.BloggingContext—as the database name and creates a connection string for this database using either SQL Express or LocalDB. Wenn beides installiert ist, wird SQL Express verwendet.If both are installed, SQL Express will be used.

Visual Studio 2010 enthält standardmäßig SQL Express, und Visual Studio 2012 und höher enthalten localdb.Visual Studio 2010 includes SQL Express by default and Visual Studio 2012 and later includes LocalDB. Während der Installation überprüft das nuget-Paket "EntityFramework", welcher Datenbankserver verfügbar ist.During installation, the EntityFramework NuGet package checks which database server is available. Das nuget-Paket aktualisiert dann die Konfigurationsdatei, indem der von Code First verwendete Standarddaten Bankserver beim Erstellen einer Verbindung per Konvention festgelegt wird.The NuGet package will then update the configuration file by setting the default database server that Code First uses when creating a connection by convention. Wenn SQL Express ausgeführt wird, wird es verwendet.If SQL Express is running, it will be used. Wenn SQL Express nicht verfügbar ist, wird localdb stattdessen als Standard registriert.If SQL Express is not available then LocalDB will be registered as the default instead. An der Konfigurationsdatei werden keine Änderungen vorgenommen, wenn Sie bereits eine Einstellung für die standardverbindungsfactory enthält.No changes are made to the configuration file if it already contains a setting for the default connection factory.

Code First mit Verbindung gemäß Konvention und angegebenem Datenbanknamen verwendenUse Code First with connection by convention and specified database name

Wenn Sie in der Anwendung keine andere Konfiguration ausgeführt haben, führt der Aufruf des zeichenfolgenkonstruktors in dbcontext mit dem Datenbanknamen, den Sie verwenden möchten, dazu, dass dbcontext in Code First Modus mit einer Datenbankverbindung ausgeführt wird, die in der Datenbank mit diesem Namen erstellt wurde.If you have not done any other configuration in your application, then calling the string constructor on DbContext with the database name you want to use will cause DbContext to run in Code First mode with a database connection created by convention to the database of that name. Beispiel:For example:

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

In diesem Beispiel verwendet dbcontext "bloggingdatabase" als Datenbanknamen und erstellt eine Verbindungs Zeichenfolge für diese Datenbank entweder mithilfe von SQL Express (installiert mit Visual Studio 2010) oder localdb (installiert mit Visual Studio 2012).In this example DbContext uses “BloggingDatabase” as the database name and creates a connection string for this database using either SQL Express (installed with Visual Studio 2010) or LocalDB (installed with Visual Studio 2012). Wenn beides installiert ist, wird SQL Express verwendet.If both are installed, SQL Express will be used.

Verwenden von Code First mit Verbindungs Zeichenfolge in app.config/web.config-DateiUse Code First with connection string in app.config/web.config file

Sie können eine Verbindungs Zeichenfolge in ihrer app.config oder web.config Datei platzieren.You may choose to put a connection string in your app.config or web.config file. Beispiel:For example:

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

Dies ist eine einfache Möglichkeit, dbcontext anzuweisen, einen anderen Datenbankserver als SQL Express oder localdb zu verwenden – das obige Beispiel gibt eine SQL Server Compact Edition-Datenbank an.This is an easy way to tell DbContext to use a database server other than SQL Express or LocalDB — the example above specifies a SQL Server Compact Edition database.

Wenn der Name der Verbindungs Zeichenfolge mit dem Namen Ihres Kontexts übereinstimmt (entweder mit oder ohne Namespace Qualifizierung), wird er von dbcontext gefunden, wenn der Parameter lose Konstruktor verwendet wird.If the name of the connection string matches the name of your context (either with or without namespace qualification) then it will be found by DbContext when the parameterless constructor is used. Wenn sich der Name der Verbindungs Zeichenfolge vom Namen Ihres Kontexts unterscheidet, können Sie dbcontext anweisen, diese Verbindung im Code First Modus zu verwenden, indem Sie den Namen der Verbindungs Zeichenfolge an den dbcontext-Konstruktor übergeben.If the connection string name is different from the name of your context then you can tell DbContext to use this connection in Code First mode by passing the connection string name to the DbContext constructor. Beispiel:For example:

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

Alternativ können Sie das Format "Name = <connection string name> " für die Zeichenfolge verwenden, die an den dbcontext-Konstruktor übergeben wird.Alternatively, you can use the form “name=<connection string name>” for the string passed to the DbContext constructor. Beispiel:For example:

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

Dieses Formular macht es explizit, dass die Verbindungs Zeichenfolge in der Konfigurationsdatei zu finden ist.This form makes it explicit that you expect the connection string to be found in your config file. Eine Ausnahme wird ausgelöst, wenn keine Verbindungs Zeichenfolge mit dem angegebenen Namen gefunden wird.An exception will be thrown if a connection string with the given name is not found.

Datenbank/Model First mit Verbindungs Zeichenfolge in app.config/web.config-DateiDatabase/Model First with connection string in app.config/web.config file

Modelle, die mit dem EF-Designer erstellt wurden, unterscheiden sich von Code First darin, dass das Modell bereits vorhanden ist und nicht aus Code generiert wird, wenn die Anwendung ausgeführt wirdModels created with the EF Designer are different from Code First in that your model already exists and is not generated from code when the application runs. Das Modell ist in der Regel als EDMX-Datei in Ihrem Projekt vorhanden.The model typically exists as an EDMX file in your project.

Der Designer fügt eine EF-Verbindungs Zeichenfolge zu ihrer app.config oder web.config Datei hinzu.The designer will add an EF connection string to your app.config or web.config file. Diese Verbindungs Zeichenfolge ist insofern speziell, als Sie Informationen darüber enthält, wie Sie die Informationen in der EDMX-Datei finden.This connection string is special in that it contains information about how to find the information in your EDMX file. Beispiel:For example:

<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 außerdem Code, der dbcontext mitteilt, dass diese Verbindung verwendet werden soll, indem der Name der Verbindungs Zeichenfolge an den dbcontext-Konstruktor übergeben wird.The EF Designer will also generate code that tells DbContext to use this connection by passing the connection string name to the DbContext constructor. Beispiel:For example:

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 die Verbindungs Zeichenfolge eine EF-Verbindungs Zeichenfolge mit Details des zu verwendenden Modells ist.DbContext knows to load the existing model (rather than using Code First to calculate it from code) because the connection string is an EF connection string containing details of the model to use.

Weitere dbcontext-konstruktoroptionenOther DbContext constructor options

Die dbcontext-Klasse enthält andere Konstruktoren und Verwendungs Muster, die einige erweiterte Szenarien ermöglichen.The DbContext class contains other constructors and usage patterns that enable some more advanced scenarios. Einige davon sind:Some of these are:

  • Sie können die dbmodelbuilder-Klasse verwenden, um ein Code First Modell zu erstellen, ohne eine dbcontext-Instanz zu instanziieren.You can use the DbModelBuilder class to build a Code First model without instantiating a DbContext instance. Das Ergebnis dieses Objekts ist ein dbmodel-Objekt.The result of this is a DbModel object. Sie können dieses dbmodel-Objekt dann an einen der dbcontext-Konstruktoren übergeben, wenn Sie bereit sind, die dbcontext-Instanz zu erstellen.You can then pass this DbModel object to one of the DbContext constructors when you are ready to create your DbContext instance.
  • Sie können eine vollständige Verbindungs Zeichenfolge an dbcontext übergeben, anstatt nur den Namen der Datenbank oder der Verbindungs Zeichenfolge.You can pass a full connection string to DbContext instead of just the database or connection string name. Diese Verbindungs Zeichenfolge wird standardmäßig mit dem System. Data. SqlClient-Anbieter verwendet. Dies kann geändert werden, indem eine andere iconnectionfactory-Implementierung auf den Kontext festgelegt wird. Database. defaultconnectionfactory.By default this connection string is used with the System.Data.SqlClient provider; this can be changed by setting a different implementation of IConnectionFactory onto context.Database.DefaultConnectionFactory.
  • Sie können ein vorhandenes DbConnection-Objekt verwenden, indem Sie es an einen dbcontext-Konstruktor übergeben.You can use an existing DbConnection object by passing it to a DbContext constructor. Wenn das Verbindungs Objekt eine Instanz von EntityConnection ist, wird das in der Verbindung angegebene Modell verwendet, anstatt ein Modell mithilfe von Code First zu berechnen.If the connection object is an instance of EntityConnection, then the model specified in the connection will be used rather than calculating a model using Code First. Wenn das Objekt eine Instanz eines anderen Typs ist – z. b. SqlConnection –, wird der Kontext ihn für Code First Modus verwenden.If the object is an instance of some other type—for example, SqlConnection—then the context will use it for Code First mode.
  • Sie können einen vorhandenen ObjectContext an einen dbcontext-Konstruktor übergeben, um einen dbcontext zu erstellen, der den vorhandenen Kontext umwickelt.You can pass an existing ObjectContext to a DbContext constructor to create a DbContext wrapping the existing context. Dies kann für vorhandene Anwendungen verwendet werden, die ObjectContext verwenden, aber in einigen Teilen der Anwendung dbcontext nutzen möchten.This can be used for existing applications that use ObjectContext but which want to take advantage of DbContext in some parts of the application.