Строки подключения и модели

В этом разделе описано, как Entity Framework обнаруживает, какое подключение к базе данных следует использовать, и как его можно изменить. в этом разделе рассматриваются модели, созданные с помощью Code First и конструктора EF.

Обычно Entity Framework приложение использует класс, производный от DbContext. Этот производный класс будет вызывать один из конструкторов базового класса DbContext для управления:

  • Как контекст будет подключаться к базе данных, то есть как строка подключения будет найдена или использована
  • будет ли контекст использовать вычисление модели с помощью Code First или загрузить модель, созданную с помощью конструктора EF
  • Дополнительные дополнительные параметры

В следующих фрагментах показаны некоторые способы использования конструкторов DbContext.

использование Code First с подключением по соглашению

если вы еще не выполнили какие-либо другие настройки в приложении, то вызов конструктора без параметров в DbContext приведет к запуску DbContext в режиме Code First с подключением к базе данных, созданным по соглашению. Пример:

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

в этом примере DbContext использует полное имя пространства имен производного класса контекста — Demo. EF. BloggingContext — в качестве имени базы данных и создает строку подключения для этой базы данных с помощью SQL Express или LocalDB. если установлены оба варианта, будет использоваться SQL Express.

Visual Studio 2010 включает SQL Express по умолчанию, а Visual Studio 2012 и более поздних версий включает LocalDB. во время установки пакет NuGet EntityFramework проверяет, какой сервер базы данных доступен. затем пакет NuGet обновит файл конфигурации, задав сервер базы данных по умолчанию, который Code First использует при создании соединения по соглашению. если SQL Express выполняется, он будет использоваться. если SQL Express недоступна, LocalDB будет зарегистрирован как значение по умолчанию. В файл конфигурации не вносятся изменения, если он уже содержит параметр для фабрики подключений по умолчанию.

использование Code First с подключением по соглашению и указанным именем базы данных

если вы не выполнили какие-либо другие настройки в приложении, то вызов конструктора строк для DbContext с именем базы данных, которое вы хотите использовать, приведет к запуску DbContext в режиме Code First с подключением к базе данных, созданным по соглашению с базой данных этого имени. Пример:

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

в этом примере DbContext использует "блоггингдатабасе" в качестве имени базы данных и создает строку подключения для этой базы данных с помощью SQL Express (устанавливается с Visual Studio 2010) или LocalDB (устанавливается вместе с Visual Studio 2012). если установлены оба варианта, будет использоваться SQL Express.

использование Code First со строкой подключения в файле app.configили web.config

Вы можете указать строку подключения в app.config или web.config файле. Пример:

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

это простой способ указать DbContext использовать сервер базы данных, отличный от SQL Express или LocalDB — в приведенном выше примере указывается база данных SQL Server Compact Edition.

Если имя строки подключения совпадает с именем контекста (с квалификатором пространства имен или без него), то при использовании конструктора без параметров он будет найден с помощью DbContext. если имя строки подключения отличается от имени контекста, можно указать DbContext использовать это соединение в режиме Code First, передав имя строки подключения конструктору DbContext. Пример:

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

Кроме того, можно использовать форму "имя = < имя строки подключения > " для строки, передаваемой конструктору DbContext. Пример:

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

Эта форма явно делает то, что строка подключения будет найдена в файле конфигурации. Если строка подключения с данным именем не найдена, будет выдано исключение.

База данных/Model First со строкой подключения в файле app.configили web.config

модели, созданные с помощью конструктора EF, отличаются от Code First тем, что модель уже существует и не создается из кода при запуске приложения. Модель обычно существует в файле EDMX в проекте.

Конструктор добавит строку подключения EF в app.config или web.config файл. Эта строка подключения является особой в том, что она содержит сведения о том, как найти информацию в файле EDMX. Пример:

<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 также создаст код, который сообщает DbContext использовать это соединение, передав имя строки подключения конструктору DbContext. Пример:

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

DbContext знает о загрузке существующей модели (вместо использования Code First для ее вычисления из кода), так как строка подключения является строкой соединения EF, содержащей сведения о модели для использования.

Другие параметры конструктора DbContext

Класс DbContext содержит другие конструкторы и шаблоны использования, которые позволяют использовать некоторые более сложные сценарии. Вот некоторые из них:

  • класс дбмоделбуилдер можно использовать для создания модели Code First без создания экземпляра DbContext. Результатом этого является объект Дбмодел. Затем этот объект Дбмодел можно передать в один из конструкторов DbContext, когда вы будете готовы создать экземпляр DbContext.
  • Можно передать полную строку подключения в DbContext, а не только имя базы данных или строки подключения. По умолчанию эта строка подключения используется с поставщиком System. Data. SqlClient. Это можно изменить, задав другую реализацию Иконнектионфактори на контекст. База данных. Дефаултконнектионфактори.
  • Можно использовать существующий объект DbConnection, передав его в конструктор DbContext. Если объект Connection является экземпляром EntityConnection, то модель, указанная в соединении, будет использоваться вместо вычисления модели с помощью Code First. если объект является экземпляром какого-либо другого типа, например SqlConnection, то контекст будет использовать его для Code Firstного режима.
  • Вы можете передать существующий контекст ObjectContext в конструктор DbContext, чтобы создать DbContext, который создает оболочку для существующего контекста. Это можно использовать для существующих приложений, использующих ObjectContext, которые хотят использовать преимущества DbContext в некоторых частях приложения.