Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описывается, как Entity Framework обнаруживает, какое подключение к базе данных следует использовать, и как изменить ее. Модели, созданные с помощью кода First и конструктора EF, рассматриваются.
Предупреждение
В этой статье используется локальная база данных, которая не требует проверки подлинности пользователя. Рабочие приложения должны использовать самый безопасный поток проверки подлинности. Дополнительные сведения о проверке подлинности для развернутых тестовых и рабочих приложений см. в разделе "Безопасные потоки проверки подлинности".
Обычно приложение Entity Framework использует класс, производный от DbContext. Этот производный класс вызывает один из конструкторов базового класса DbContext для управления:
- Как контекст подключается к базе данных, а именно как строка подключения находится и используется.
- Вычисляет ли контекст модель с помощью кода 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=<имя строки подключения>" для строки, переданной конструктору DbContext. Например:
public class BloggingContext : DbContext
{
public BloggingContext()
: base("name=BloggingCompactDatabase")
{
}
}
Эта форма четко указывает, что строка подключения ожидается в файле конфигурации. Будет выброшено исключение, если строка подключения с заданным именем не найдена.
База данных/Сначала модель со строкой подключения в файле 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=
"Data Source=.\sqlexpress;
Initial Catalog=Northwind;
Integrated Security=True;
MultipleActiveResultSets=True""
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 в некоторых частях приложения.