다음을 통해 공유


구성 파일 설정

Entity Framework를 사용하면 구성 파일에서 여러 설정을 지정할 수 있습니다. 일반적으로 EF는 '구성에 대한 규칙' 원칙을 따릅니다. 이 게시물에 설명된 모든 설정에는 기본 동작이 있으므로 기본값이 더 이상 요구 사항을 충족하지 않는 경우 설정 변경에 대해서만 신경을 쓰면 됩니다.

코드 기반 대체

이러한 모든 설정은 코드를 사용하여 적용할 수도 있습니다. EF6부터 코드에서 구성을 적용하는 중심적인 방법을 제공하는 코드 기반 구성을 도입했습니다. EF6 이전 버전은 코드에서 구성을 계속해서 적용할 수 있지만 다양한 API를 사용하여 여러 영역을 구성해야 합니다. 구성 파일 옵션을 사용하면 코드를 업데이트하지 않고도 배포 중에 이러한 설정을 쉽게 변경할 수 있습니다.

Entity Framework 구성 섹션

EF4.1부터는 구성 파일의 appSettings 섹션을 사용하여 컨텍스트에 대한 데이터베이스 이니셜라이저를 설정할 수 있습니다. EF 4.3에서는 새 설정을 처리하는 사용자 지정 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 섹션이 필요하지 않습니다.

Code First 기반 모델은 일반 ADO.NET 연결 문자열을 사용합니다. 예시:

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

EF Designer 기반 모델은 특수 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>

코드 기반 구성 형식(EF6 이상)

EF6부터 애플리케이션의 코드 기반 구성에 사용할 EF의 DbConfiguration을 지정할 수 있습니다. 대부분의 경우 EF가 DbConfiguration을 자동으로 검색하므로 이 설정을 지정할 필요가 없습니다. 구성 파일에서 DbConfiguration을 지정해야 하는 경우에 대한 자세한 내용은 코드 기반 구성DbConfiguration 이동 섹션을 참조하세요.

DbConfiguration 형식을 설정하려면 codeConfigurationType 요소에서 정규화된 어셈블리 형식 이름을 지정합니다.

참고 항목

정규화된 어셈블리 이름은 정규화된 네임스페이스 이름 쉼표, 해당 형식이 있는 어셈블리 순서로 구성됩니다. 필요에 따라 어셈블리 버전, 문화권 및 공개 키 토큰을 지정할 수도 있습니다.

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

EF 데이터베이스 공급자(EF6 이상)

EF6 이전에는 데이터베이스 공급자의 Entity Framework 관련 부분을 핵심 ADO.NET 공급자의 일부로 포함해야 했습니다. EF6부터는 EF 관련 부분이 별도로 관리되고 등록됩니다.

일반적으로 공급자를 직접 등록할 필요가 없습니다. 이 작업은 보통 설치할 때 공급자가 수행합니다.

공급자는 entityFramework 섹션의 providers 하위 섹션 아래에 provider 요소를 포함하여 등록됩니다. 공급자 항목에는 다음의 두 가지 필수 특성이 있습니다.

  • invariantName은 이 EF 공급자가 대상으로 하는 핵심 ADO.NET 공급자를 식별합니다.
  • type은 EF 공급자 구현의 정규화된 어셈블리 형식 이름입니다.

참고 항목

정규화된 어셈블리 이름은 정규화된 네임스페이스 이름 쉼표, 해당 형식이 있는 어셈블리 순서로 구성됩니다. 필요에 따라 어셈블리 버전, 문화권 및 공개 키 토큰을 지정할 수도 있습니다.

예를 들어 Entity Framework를 설치할 때 기본 SQL Server 공급자를 등록하기 위해 만든 항목이 있습니다.

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

인터셉터(EF6.1 이상)

EF6.1부터는 구성 파일에 인터셉터를 등록할 수 있습니다. 인터셉터를 사용하면 EF가 데이터베이스 쿼리 실행, 연결 열기 등과 같은 특정 작업을 수행할 때 추가 논리를 실행할 수 있습니다.

인터셉터는 entityFramework 섹션의 interceptors 하위 섹션 아래에 interceptor 요소를 포함하여 등록됩니다. 예를 들어 다음 구성은 모든 데이터베이스 작업을 콘솔에 기록하는 내장 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 요소를 사용하여 생성자 매개 변수를 지정할 수 있습니다.

예를 들어 Entity Framework에 포함된 SqlCeConnectionFactory를 사용하려면 생성자에 공급자 고정 이름을 제공해야 합니다. 공급자 고정 이름은 사용할 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는 .\SQLEXPRESS를 가리키는 SqlConnectionFactory를 사용합니다. SqlConnectionFactory에는 연결 문자열의 일부를 재정의할 수 있는 생성자도 있습니다. .\SQLEXPRESS 이외의 SQL Server 인스턴스를 사용하려는 경우 이 생성자를 사용하여 서버를 설정할 수 있습니다.

다음 구성을 사용하면 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" />

데이터베이스 이니셜라이저

데이터베이스 이니셜라이저는 컨텍스트별로 구성됩니다. context 요소를 사용하여 구성 파일에서 설정할 수 있습니다. 이 요소는 정규화된 어셈블리 이름을 사용하여 구성되는 컨텍스트를 식별합니다.

기본적으로 Code First 컨텍스트는 CreateDatabaseIfNotExists 이니셜라이저를 사용하도록 구성됩니다. 데이터베이스 초기화를 사용하지 않도록 설정하는 데 사용할 수 있는 context 요소에는 disableDatabaseInitialization 특성이 있습니다.

예를 들어 다음 구성은 MyAssembly.dll 정의된 Blogging.BlogContext 컨텍스트에 대한 데이터베이스 초기화를 사용하지 않도록 설정합니다.

<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에 포함된 제네릭 데이터베이스 이니셜라이저 중 하나를 구성할 수 있습니다. type 특성은 제네릭 형식에 .NET Framework 형식을 사용합니다.

예를 들어 Code First 마이그레이션을 사용하는 경우 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>