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

В этом разделе описывается, как 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 использует BloggingDatabase в качестве имени базы данных и создает строку подключения для этой базы данных с помощью 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")
    {
    }
}

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

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

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

База данных или модель 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 содержит другие конструкторы и шаблоны использования, которые обеспечивают более сложные сценарии. Ниже приведены некоторые из них.

  • Класс DbModelBuilder можно использовать для создания модели Code First без создания экземпляра DbContext. Результатом этого является объект DbModel. Затем этот объект DbModel можно передать одному из конструкторов DbContext, когда вы будете готовы создать экземпляр DbContext.
  • Вы можете передать полную строку подключения в DbContext, а не только имя базы данных или строки подключения. По умолчанию эта строка подключения используется с поставщиком System.Data.SqlClient; Это можно изменить, задав другую реализацию IConnectionFactory в контексте. Database.DefaultConnectionFactory.
  • Существующий объект DbConnection можно использовать, передав его конструктору DbContext. Если объект соединения является экземпляром EntityConnection, то модель, указанная в соединении, будет использоваться вместо вычисления модели с помощью Code First. Если объект является экземпляром другого типа ( например, SqlConnection), контекст будет использовать его для режима Code First.
  • Вы можете передать существующий объект ObjectContext конструктору DbContext, чтобы создать оболочку DbContext для существующего контекста. Это можно использовать для существующих приложений, использующих ObjectContext, но которые хотят воспользоваться преимуществами DbContext в некоторых частях приложения.