Anslutningssträngar och modeller

Den här artikeln beskriver hur Entity Framework identifierar vilken databasanslutning som ska användas och hur du ändrar den. Modeller som skapats med Code First och EF Designer omfattas.

Varning

Den här artikeln använder en lokal databas som inte kräver att användaren autentiseras. Produktionsappar bör använda det säkraste tillgängliga autentiseringsflödet. Mer information om autentisering för distribuerade test- och produktionsappar finns i Säkra autentiseringsflöden.

Vanligtvis använder ett Entity Framework-program en klass som härletts från DbContext. Den här här klassen anropar en av konstruktörerna i basklassen DbContext för att styra:

  • Hur kontexten ansluter till en databas, dvs. hur en anslutningssträng hittas och används.
  • Om kontexten beräknar en modell med hjälp av Code First eller läser in en modell som skapats med EF Designer.
  • Ytterligare avancerade alternativ

Följande fragment visar några av de sätt som DbContext-konstruktorerna kan användas på.

Använd Code First med anslutning efter konvention

Om du inte har gjort någon annan konfiguration i ditt program kommer anrop av den parameterlösa konstruktorn i DbContext att göra att DbContext körs i kod först-läge med en databasanslutning som skapats av konventionen. Som exempel:

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

I det här exemplet använder DbContext det namnområdeskvalificerade namnet på din härledda kontextklass– Demo.EF.BloggingContext – som databasnamn och skapar en anslutningssträng för den här databasen med antingen SQL Express eller LocalDB. Om båda är installerade används SQL Express.

Visual Studio 2010 innehåller SQL Express som standard och Visual Studio 2012 och senare innehåller LocalDB. Under installationen kontrollerar EntityFramework NuGet-paketet vilken databasserver som är tillgänglig. NuGet-paketet uppdaterar sedan konfigurationsfilen genom att ange standarddatabasservern som Code First använder när du skapar en anslutning enligt konventionen. Om SQL Express körs används det. Om SQL Express inte är tillgängligt registreras LocalDB som standard i stället. Inga ändringar görs i konfigurationsfilen om den redan innehåller en inställning för standardanslutningsfabriken.

Använd Code First med anslutning efter konvention och angivet databasnamn

Om du inte har gjort någon annan konfiguration i programmet kommer anropet av strängkonstruktorn i DbContext med det databasnamn som du vill använda att göra så att DbContext körs i kod först-läge med en databasanslutning som skapats av konventionen till databasen med det namnet. Som exempel:

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

I det här exemplet använder DbContext "BloggingDatabase" som databasnamn och skapar en anslutningssträng för den här databasen med antingen SQL Express (installerat med Visual Studio 2010) eller LocalDB (installerat med Visual Studio 2012). Om båda är installerade används SQL Express.

Använd Code First med anslutningssträngen i filen app.config/web.config

Du kan välja att placera en anslutningssträng i app.config- eller web.config-filen. Som exempel:

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

Det här är ett enkelt sätt att tala om för DbContext att använda en annan databasserver än SQL Express eller LocalDB – exemplet ovan anger en SQL Server Compact Edition-databas.

Om namnet på anslutningssträngen matchar namnet på kontexten (antingen med eller utan namnområdeskvalifikation) så hittas det av DbContext när den parameterlösa konstruktorn används. Om anslutningssträngens namn skiljer sig från namnet på kontexten kan du be DbContext att använda den här anslutningen i läget Kod först genom att skicka anslutningssträngens namn till DbContext-konstruktorn. Som exempel:

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

Du kan också använda formuläret "name=<connection string name>" för strängen som skickas till DbContext-konstruktorn. Som exempel:

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

Det här formuläret gör det tydligt att du förväntar dig att anslutningssträngen ska hittas i konfigurationsfilen. Ett undantag utlöses om en anslutningssträng med det angivna namnet inte hittas.

Databas/Model First med anslutningssträng i app.config/web.config-fil

Modeller som skapats med EF Designer skiljer sig från Code First eftersom din modell redan finns och inte genereras från kod när programmet körs. Modellen finns vanligtvis som en EDMX-fil i projektet.

Designern lägger till en EF-anslutningssträng i din app.config- eller web.config-fil. Den här anslutningssträngen är speciell eftersom den innehåller information om hur du hittar informationen i EDMX-filen. Som exempel:

<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>

EF Designer genererar också kod som instruerar DbContext att använda den här anslutningen genom att skicka anslutningssträngnamnet till DbContext-konstruktorn. Som exempel:

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

DbContext vet att läsa in den befintliga modellen (i stället för att använda Kod först för att beräkna den från kod) eftersom anslutningssträngen är en EF-anslutningssträng som innehåller information om modellen som ska användas.

Andra alternativ för DbContext-konstruktor

Klassen DbContext innehåller andra konstruktorer och användningsmönster som möjliggör några mer avancerade scenarier. Några av dessa är:

  • Du kan använda klassen DbModelBuilder för att skapa en Code First-modell utan att instansiera en DbContext-instans. Resultatet av detta är ett DbModel-objekt. Du kan sedan skicka det här DbModel-objektet till någon av DbContext-konstruktorerna när du är redo att skapa din DbContext-instans.
  • Du kan skicka en fullständig anslutningssträng till DbContext i stället för bara namnet på databasen eller anslutningssträngen. Som standard används den här anslutningssträngen med System.Data.SqlClient-providern. Detta kan ändras genom att ange en annan implementering av IConnectionFactory på kontexten. Database.DefaultConnectionFactory.
  • Du kan använda ett befintligt DbConnection-objekt genom att skicka det till en DbContext-konstruktor. Om anslutningsobjektet är en instans av EntityConnection används modellen som anges i anslutningen i stället för att beräkna en modell med hjälp av Code First. Om objektet är en instans av någon annan typ, till exempel SqlConnection, kommer kontexten att använda den för code first-läge.
  • Du kan skicka en befintlig ObjectContext till en DbContext-konstruktor för att skapa en DbContext-omslutning av den befintliga kontexten. Detta kan användas för befintliga program som använder ObjectContext men som vill dra nytta av DbContext i vissa delar av programmet.