Параметры файла конфигурации

Entity Framework позволяет указать несколько параметров из файла конфигурации. Как правило, EF следует принципу "соглашения о конфигурации": все параметры, описанные в этой записи, имеют поведение по умолчанию, вам нужно беспокоиться только об изменении параметра, если значение по умолчанию больше не соответствует вашим требованиям.

Альтернатива Code-Based

Все эти параметры также можно применить с помощью кода. Начиная с EF6, мы представили конфигурацию на основе кода, которая предоставляет центральный способ применения конфигурации из кода. До ВЫПУСКА EF6 конфигурацию по-прежнему можно применить из кода, но для настройки различных областей необходимо использовать различные API. Параметр файла конфигурации позволяет легко изменять эти параметры во время развертывания без обновления кода.

Раздел конфигурации Entity Framework

Начиная с EF4.1 можно задать инициализатор базы данных для контекста с помощью раздела appSettings файла конфигурации. В EF 4.3 мы представили раздел custom entityFramework для обработки новых параметров. Entity Framework по-прежнему распознает инициализаторы базы данных, заданные с использованием старого формата, но рекомендуется перейти к новому формату, если это возможно.

Раздел entityFramework был автоматически добавлен в файл конфигурации проекта при установке пакета NuGet EntityFramework.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework"
       type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
</configuration>

Строки соединения

На этой странице содержатся дополнительные сведения о том, как Entity Framework определяет используемую базу данных, включая строки подключения в файле конфигурации.

Строки подключения переходят в стандартный элемент connectionStrings и не требуют раздела entityFramework .

Модели на основе кода на основе кода используют обычные строки подключения ADO.NET. Пример:

<connectionStrings>
  <add name="BlogContext"  
        providerName="System.Data.SqlClient"  
        connectionString="Server=.\SQLEXPRESS;Database=Blogging;Integrated Security=True;"/>
</connectionStrings>

Модели на основе конструктора EF используют специальные строки подключения EF. Пример:

<connectionStrings>
  <add name="BlogContext"  
    connectionString=
      "metadata=
        res://*/BloggingModel.csdl|
        res://*/BloggingModel.ssdl|
        res://*/BloggingModel.msl;
      provider=System.Data.SqlClient;
      provider connection string=
        &quot;data source=(localdb)\mssqllocaldb;
        initial catalog=Blogging;
        integrated security=True;
        multipleactiveresultsets=True;&quot;"
     providerName="System.Data.EntityClient" />
</connectionStrings>

тип конфигурации Code-Based (EF6 и более поздние версии)

Начиная с EF6, можно указать DbConfiguration для EF, который будет использоваться для конфигурации на основе кода в приложении. В большинстве случаев вам не нужно указывать этот параметр, так как EF автоматически обнаружит dbConfiguration. Сведения о том, когда может потребоваться указать DbConfiguration в файле конфигурации, см. в разделе "Перемещение dbConfiguration " конфигурации на основе кода.

Чтобы задать тип DbConfiguration, необходимо указать полное имя типа сборки в элементе codeConfigurationType .

Примечание

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

<entityFramework codeConfigurationType="MyNamespace.MyConfiguration, MyAssembly">
</entityFramework>

Поставщики баз данных EF (EF6 и более поздние версии)

До ВЫПУСКА EF6 части поставщика базы данных для Entity Framework должны быть включены в состав основного поставщика ADO.NET. Начиная с EF6, отдельные части EF теперь управляются и регистрируются отдельно.

Обычно вам не нужно регистрировать поставщиков самостоятельно. Как правило, поставщик будет выполнять это при его установке.

Поставщики регистрируются путем включения элемента поставщика в дочерний раздел поставщиков раздела entityFramework . Для записи поставщика существует два обязательных атрибута:

  • InvariantName определяет основной поставщик ADO.NET, который предназначен для этого поставщика EF.
  • type — это полное имя типа сборки реализации поставщика EF.

Примечание

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

В качестве примера ниже приведена запись, созданная для регистрации поставщика SQL Server по умолчанию при установке Entity Framework.

<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>

Перехватчики (EF6.1 и более поздние версии)

Начиная с EF6.1 можно зарегистрировать перехватчики в файле конфигурации. Перехватчики позволяют выполнять дополнительную логику при выполнении определенных операций EF, таких как выполнение запросов к базе данных, открытие подключений и т. д.

Перехватчики регистрируются путем включения элемента перехватчика в дочерний раздел перехватчика в разделе entityFramework . Например, следующая конфигурация регистрирует встроенный перехватчик DatabaseLogger , который будет записывать все операции базы данных в консоль.

<interceptors>
  <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework"/>
</interceptors>

Ведение журнала операций базы данных в файл (EF6.1 и более поздних версий)

Регистрация перехватчиков с помощью файла конфигурации особенно полезна при добавлении журнала в существующее приложение для отладки проблемы. DatabaseLogger поддерживает ведение журнала в файле, указав имя файла в качестве параметра конструктора.

<interceptors>
  <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework">
    <parameters>
      <parameter value="C:\Temp\LogOutput.txt"/>
    </parameters>
  </interceptor>
</interceptors>

По умолчанию файл журнала будет перезаписан новым файлом при каждом запуске приложения. Чтобы вместо этого добавить в файл журнала, если он уже существует, используйте примерно следующее:

<interceptors>
  <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework">
    <parameters>
      <parameter value="C:\Temp\LogOutput.txt"/>
      <parameter value="true" type="System.Boolean"/>
    </parameters>
  </interceptor>
</interceptors>

Дополнительные сведения о DatabaseLogger и регистрации перехватчиков см. в записи блога EF 6.1. Включение ведения журнала без повторной компиляции.

Фабрика подключений по умолчанию code First

В разделе конфигурации можно указать фабрику подключений по умолчанию, которую Code First должен использовать для поиска базы данных, используемой для контекста. Фабрика подключений по умолчанию используется только в том случае, если строка подключения не была добавлена в файл конфигурации для контекста.

При установке пакета EF NuGet была зарегистрирована фабрика подключений по умолчанию, которая указывает на SQL Express или LocalDB в зависимости от установленного.

Чтобы задать фабрику подключений, укажите полное имя типа сборки в элементе defaultConnectionFactory .

Примечание

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

Ниже приведен пример настройки собственной фабрики подключений по умолчанию:

<entityFramework>
  <defaultConnectionFactory type="MyNamespace.MyCustomFactory, MyAssembly"/>
</entityFramework>

В приведенном выше примере для пользовательской фабрики требуется конструктор без параметров. При необходимости можно указать параметры конструктора с помощью элемента parameters .

Например, SqlCeConnectionFactory, включенный в Entity Framework, требует указать инвариантное имя поставщика конструктору. Инвариантное имя поставщика определяет версию SQL Compact, которую вы хотите использовать. Следующая конфигурация по умолчанию приведет к использованию контекстов SQL Compact версии 4.0.

<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
    <parameters>
      <parameter value="System.Data.SqlServerCe.4.0" />
    </parameters>
  </defaultConnectionFactory>
</entityFramework>

Если вы не задали фабрику подключений по умолчанию, Code First использует SqlConnectionFactory, указывая на .\SQLEXPRESS. SqlConnectionFactory также имеет конструктор, который позволяет переопределять части строки подключения. Если вы хотите использовать экземпляр SQL Server, отличный от .\SQLEXPRESS этого конструктора, чтобы задать сервер.

Следующая конфигурация приведет к тому, что Code First будет использовать MyDatabaseServer для контекстов, которые не имеют явного набора строк подключения.

<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
    <parameters>
      <parameter value="Data Source=MyDatabaseServer; Integrated Security=True; MultipleActiveResultSets=True" />
    </parameters>
  </defaultConnectionFactory>
</entityFramework>

По умолчанию предполагается, что аргументы конструктора имеют строку типа. Для этого можно использовать атрибут типа.

<parameter value="2" type="System.Int32" />

Инициализаторы базы данных

Инициализаторы базы данных настраиваются для каждого контекста. Их можно задать в файле конфигурации с помощью контекстного элемента. Этот элемент использует полное имя сборки для идентификации настраиваемого контекста.

По умолчанию контексты Code First настраиваются для использования инициализатора CreateDatabaseIfNotExists. В контекстном элементе есть атрибут disableDatabaseInitialization, который можно использовать для отключения инициализации базы данных.

Например, следующая конфигурация отключает инициализацию базы данных для контекста Blogging.BlogContext, определенного в MyAssembly.dll.

<contexts>
  <context type=" Blogging.BlogContext, MyAssembly" disableDatabaseInitialization="true" />
</contexts>

Элемент databaseInitializer можно использовать для задания настраиваемого инициализатора.

<contexts>
  <context type=" Blogging.BlogContext, MyAssembly">
    <databaseInitializer type="Blogging.MyCustomBlogInitializer, MyAssembly" />
  </context>
</contexts>

Параметры конструктора используют тот же синтаксис, что и фабрики подключений по умолчанию.

<contexts>
  <context type=" Blogging.BlogContext, MyAssembly">
    <databaseInitializer type="Blogging.MyCustomBlogInitializer, MyAssembly">
      <parameters>
        <parameter value="MyConstructorParameter" />
      </parameters>
    </databaseInitializer>
  </context>
</contexts>

Можно настроить один из универсальных инициализаторов баз данных, включенных в Entity Framework. Атрибут типа использует формат платформа .NET Framework для универсальных типов.

Например, при использовании Code First Migrations можно настроить автоматическую миграцию базы данных с помощью инициализатораMigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration>.

<contexts>
  <context type="Blogging.BlogContext, MyAssembly">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[Blogging.BlogContext, MyAssembly], [Blogging.Migrations.Configuration, MyAssembly]], EntityFramework" />
  </context>
</contexts>