연결 문자열 및 모델

이 항목에서는 Entity Framework가 사용할 데이터베이스 연결을 검색하는 방법과 이를 변경하는 방법을 다룹니다. Code First와 EF Designer를 사용하여 만든 모델은 모두 이 항목에서 다룹니다.

일반적으로 Entity Framework 애플리케이션은 DbContext에서 파생된 클래스를 사용합니다. 이 파생 클래스는 기본 DbContext 클래스의 생성자 중 하나를 호출하여 다음을 제어합니다.

  • 컨텍스트가 데이터베이스에 연결하는 방법, 즉 연결 문자열을 찾거나 사용하는 방법
  • 컨텍스트가 Code First를 사용하여 모델 계산을 사용할지 아니면 EF Designer로 만든 모델을 로드할지 여부
  • 추가 고급 옵션

다음 조각에서는 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가 포함되어 있습니다. 설치하는 동안 EntityFramework NuGet 패키지는 사용 가능한 데이터베이스 서버를 확인합니다. 그런 다음 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가 사용됩니다.

app.config/web.config 파일에서 연결 문자열과 함께 Code First 사용

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 생성자에 전달하여 DbContext의 Code First 모드에서 이 연결을 사용하도록 지시할 수 있습니다. 예시:

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

또는 DbContext 생성자에 전달된 문자열에 대해 "name=<connection string name>" 양식을 사용할 수 있습니다. 예시:

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

이 양식을 사용하면 구성 파일에서 연결 문자열을 찾을 수 있다는 점을 명시적으로 알 수 있습니다. 지정된 이름의 연결 문자열을 찾을 수 없는 경우 예외가 throw됩니다.

pp.config/web.config 파일에서 연결 문자열과 함께 Database/Model First 사용

EF Designer를 사용하여 만든 모델은 모델이 이미 존재하고 애플리케이션이 실행될 때 코드에서 생성되지 않는다는 측면에서 Code First와는 다릅니다. 모델은 일반적으로 프로젝트에 EDMX 파일로 존재합니다.

디자이너는 app.config 또는 web.config 파일에 EF 연결 문자열을 추가합니다. 이 연결 문자열은 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 Designer는 연결 문자열 이름을 DbContext 생성자에 전달하여 DbContext에 이 연결을 사용하도록 지시하는 코드도 생성합니다. 예시:

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

연결 문자열은 사용할 모델의 세부 정보가 포함된 EF 연결 문자열이기 때문에 DbContext는 Code First를 사용하여 코드에서 계산하는 대신 기존 모델을 로드하는 방법을 알고 있습니다.

기타 DbContext 생성자 옵션

DbContext 클래스에는 몇 가지 고급 시나리오를 가능하게 하는 다른 생성자 및 사용 패턴이 포함되어 있습니다. 이들 중 일부는 다음과 같습니다.

  • DbModelBuilder 클래스를 사용하면 DbContext 인스턴스를 인스턴스화하지 않고도 Code First 모델을 빌드할 수 있습니다. 그 결과는 DbModel 개체가 생성됩니다. 그런 다음, DbContext 인스턴스를 만들 준비가 되면 이 DbModel 개체를 DbContext 생성자 중 하나에 전달할 수 있습니다.
  • 데이터베이스 또는 연결 문자열 이름 대신 전체 연결 문자열을 DbContext에 전달할 수 있습니다. 기본적으로 이 연결 문자열은 System.Data.SqlClient 공급자와 함께 사용됩니다. 이는 context.Database.DefaultConnectionFactory에 IConnectionFactory의 다른 구현을 설정하여 변경할 수 있습니다.
  • 기존 DbConnection 개체를 DbContext 생성자에 전달하여 사용할 수 있습니다. 연결 개체가 EntityConnection의 인스턴스인 경우 Code First를 사용하여 모델을 계산하는 대신 연결에 지정된 모델이 사용됩니다. 개체가 다른 유형(예: SqlConnection)의 인스턴스인 경우 컨텍스트는 해당 개체를 Code First 모드에 사용합니다.
  • 기존 ObjectContext를 DbContext 생성자에 전달하여 기존 컨텍스트를 래핑하는 DbContext를 만들 수 있습니다. 이는 ObjectContext를 사용하지만 애플리케이션의 일부 부분에서 DbContext를 활용하려는 기존 애플리케이션에 사용할 수 있습니다.