학습
모듈
EF Core를 사용하여 관계형 데이터 유지 및 검색 - Training
이 모듈은 데이터 액세스 프로젝트를 만드는 단계를 안내합니다. EF Core(Entity Framework Core)를 사용하여 관계형 데이터베이스에 연결하고 CRUD(만들기, 읽기, 업데이트, 삭제) 쿼리를 구성합니다.
Entity Framework Core용 CLI(명령줄 인터페이스) 도구는 디자인 타임 개발 작업을 수행합니다. 예를 들어 이러한 도구는 마이그레이션을 만들고, 마이그레이션을 적용하고, 기존 데이터베이스를 기반으로 모델용 코드를 생성합니다. 명령은 .NET Core SDK의 일부인 플랫폼 간 dotnet 명령에 대한 확장입니다. .NET Core 프로젝트를 사용할 수 없음
Visual Studio를 사용하는 경우 CLI 도구 대신 패키지 관리자 콘솔 도구를 사용하는 것이 좋습니다. 패키지 관리자 콘솔 도구는 자동으로 다음을 수행합니다.
dotnet ef
는 전역 또는 로컬 도구로 설치할 수 있습니다. 대부분 개발자는 다음 명령을 사용하여 dotnet ef
를 전역 도구로 설치하는 것을 선호합니다.
dotnet tool install --global dotnet-ef
로컬 도구로 사용하려면 도구 매니페스트 파일을 사용하여 이 도구를 도구 종속성으로 선언하는 프로젝트의 종속성을 복원합니다.
다음 명령을 사용하여 도구를 업데이트합니다.
dotnet tool update --global dotnet-ef
특정 프로젝트에서 도구를 사용하려면 Microsoft.EntityFrameworkCore.Design
패키지를 추가해야 합니다.
dotnet add package Microsoft.EntityFrameworkCore.Design
다음 명령을 실행하여 EF Core CLI 도구가 올바르게 설치되었는지 확인합니다.
dotnet ef
명령의 출력은 사용 중인 도구의 버전을 식별합니다.
_/\__
---==/ \\
___ ___ |. \|\
| __|| __| | ) \\\
| _| | _| \_/ | //|\\
|___||_| / \\\/\\
Entity Framework Core .NET Command-line Tools 2.1.3-rtm-32065
<Usage documentation follows, not shown.>
dotnet tool update --global dotnet-ef
를 사용하여 전역 도구를 사용 가능한 최신 버전으로 업데이트합니다. 프로젝트에 로컬로 설치된 도구가 있는 경우 dotnet tool update dotnet-ef
를 사용합니다. 명령에 --version <VERSION>
을 추가하여 특정 버전을 설치합니다. 자세한 내용은 dotnet 도구 설명서의 업데이트 섹션을 참조하세요.
도구를 사용하기 전에 시작 프로젝트를 만들거나 환경을 설정해야 할 수 있습니다.
명령은 프로젝트 및 시작 프로젝트를 참조합니다.
프로젝트는 명령이 파일을 추가하거나 제거하는 위치이기 때문에 대상 프로젝트라고도 합니다. 기본적으로 현재 디렉터리의 프로젝트는 대상 프로젝트입니다. --project
시작 프로젝트는 도구가 빌드하고 실행하는 프로젝트입니다. 도구는 디자인 타임에 애플리케이션 코드를 실행하여 데이터베이스 연결 문자열 및 모델 구성과 같은 프로젝트에 대한 정보를 가져와야 합니다. 기본적으로 현재 디렉터리의 프로젝트는 시작 프로젝트입니다. --startup-project
시작 프로젝트와 대상 프로젝트는 종종 동일한 프로젝트입니다. 별도의 프로젝트인 일반적인 시나리오는 다음과 같습니다.
EF Core 컨텍스트와 별도로 클래스 라이브러리에 마이그레이션 코드를 배치할 수도 있습니다.
CLI 도구는 .NET Core 프로젝트 및 .NET Framework 프로젝트에서 작동합니다. .NET Standard 클래스 라이브러리에 EF Core 모델이 있는 앱에는 .NET Core 또는 .NET Framework 프로젝트가 없을 수 있습니다. 예를 들어 Xamarin 및 유니버설 Windows 플랫폼 앱의 경우입니다. 이러한 경우 도구의 시작 프로젝트 역할을 하는 유일한 목적인 .NET Core 콘솔 앱 프로젝트를 만들 수 있습니다. 프로젝트는 실제 코드가 없는 임시 프로젝트일 수 있으며, 도구에 대한 대상을 제공하는 데만 필요합니다.
더미 프로젝트가 필요한 이유는 무엇인가요? 앞에서 설명한 대로 도구는 디자인 타임에 애플리케이션 코드를 실행해야 합니다. 이렇게 하려면 .NET Core 런타임을 사용해야 합니다. EF Core 모델이 .NET Core 또는 .NET Framework 대상으로 하는 프로젝트에 있는 경우 EF Core 도구는 프로젝트에서 런타임을 차용합니다. EF Core 모델이 .NET Standard 클래스 라이브러리에 있는 경우 이 작업을 수행할 수 없습니다. .NET Standard는 실제 .NET 구현이 아닙니다. .NET 구현에서 지원해야 하는 API 집합의 사양입니다. 따라서 .NET Standard는 EF Core 도구가 애플리케이션 코드를 실행하는 데 충분하지 않습니다. 시작 프로젝트로 사용하기 위해 만든 더미 프로젝트는 도구가 .NET Standard 클래스 라이브러리를 로드할 수 있는 구체적인 대상 플랫폼을 제공합니다.
명령줄에서 ASP.NET Core 프로젝트에 대한 환경을 지정할 수 있습니다. 이 인수와 추가 인수는 Program.CreateHostBuilder에 전달됩니다.
dotnet ef database update -- --environment Production
팁
--
토큰은 뒤에 나타나는 모든 항목을 인수로 처리하고 이를 옵션으로 구문 분석하지 않도록 dotnet ef
에 지시합니다. dotnet ef
에서 사용하지 않는 추가 인수는 앱으로 전달됩니다.
옵션 | Short | 설명 |
---|---|---|
--json |
JSON 출력을 표시합니다. | |
--context <DBCONTEXT> |
-c |
사용할 DbContext 클래스입니다. 네임스페이스를 사용하여 클래스 이름만 또는 정규화됩니다. 이 옵션을 생략하면 EF Core는 컨텍스트 클래스를 찾습니다. 여러 컨텍스트 클래스가 있는 경우 이 옵션이 필요합니다. |
--project <PROJECT> |
-p |
대상 프로젝트의 프로젝트 폴더에 대한 상대 경로입니다. 기본값은 현재 폴더입니다. |
--startup-project <PROJECT> |
-s |
시작 프로젝트의 프로젝트 폴더에 대한 상대 경로입니다. 기본값은 현재 폴더입니다. |
--framework <FRAMEWORK> |
대상 프레임워크에 대한 대상 프레임워크 모니커입니다. 프로젝트 파일이 여러 대상 프레임워크를 지정하고 그 중 하나를 선택하려는 경우에 사용합니다. | |
--configuration <CONFIGURATION> |
빌드 구성(예: Debug 또는 Release )입니다. |
|
--runtime <IDENTIFIER> |
패키지를 복원할 대상 런타임의 식별자입니다. RID(런타임 식별자) 목록은 RID 카탈로그를 참조하세요. | |
--no-build |
프로젝트를 빌드하지 마세요. 빌드가 최신 상태일 때 사용할 수 있습니다. | |
--help |
-h |
도움말 정보를 표시합니다. |
--verbose |
-v |
자세한 정보 출력을 표시합니다. |
--no-color |
출력에 색을 지정하지 마세요. | |
--prefix-output |
수준이 있는 접두사 출력입니다. |
추가 인수는 애플리케이션에 전달됩니다.
데이터베이스를 삭제합니다.
옵션:
옵션 | Short | 설명 |
---|---|---|
--force |
-f |
확인하지 마세요. |
--dry-run |
삭제할 데이터베이스를 표시하지만 삭제하지 마세요. |
일반적인 옵션은 위에 나열되어 있습니다.
데이터베이스를 마지막 마이그레이션 또는 지정된 마이그레이션으로 업데이트합니다.
인수:
인수 | 설명 |
---|---|
<MIGRATION> |
대상 마이그레이션입니다. 마이그레이션은 이름 또는 ID로 식별될 수 있습니다. 숫자 0은 첫 번째 마이그레이션 전을 의미하는 특별한 경우이며 모든 마이그레이션을 되돌립니다. 마이그레이션을 지정하지 않으면 명령은 기본적으로 마지막 마이그레이션으로 설정됩니다. |
옵션:
옵션 | 설명 |
---|---|
--connection <CONNECTION> |
데이터베이스에 대한 연결 문자열입니다. 기본값은 AddDbContext 또는 OnConfiguring 에 지정된 마이그레이션입니다. |
일반적인 옵션은 위에 나열되어 있습니다.
다음 예제에서는 데이터베이스를 지정된 마이그레이션으로 업데이트합니다. 첫 번째는 마이그레이션 이름을 사용하고 두 번째는 마이그레이션 ID와 지정된 연결을 사용합니다.
dotnet ef database update InitialCreate
dotnet ef database update 20180904195021_InitialCreate --connection your_connection_string
DbContext
형식에 대한 정보를 가져옵니다.
일반적인 옵션은 위에 나열되어 있습니다.
사용 가능한 DbContext
형식을 나열합니다.
일반적인 옵션은 위에 나열되어 있습니다.
및 사전 컴파일 쿼리에서 사용하는 DbContext
모델의 컴파일된 버전을 생성합니다.
자세한 내용은 컴파일된 모델을 참조하세요.
옵션:
옵션 | Short | 설명 |
---|---|---|
--output-dir <PATH> |
-o |
파일을 넣을 디렉터리입니다. 경로는 프로젝트 디렉터리를 기준으로 합니다. |
--namespace <NAMESPACE> |
-n |
생성된 모든 클래스에 사용할 네임스페이스입니다. 기본값은 루트 네임스페이스 및 출력 디렉터리와 CompiledModels 에서 생성됩니다. |
--suffix <SUFFIX> |
생성된 모든 파일의 이름에 연결할 접미사입니다. 예를 들어 이러한 파일에 생성된 코드가 포함되어 있음을 나타내는 데 사용할 수 있습니다. .g |
|
--no-scaffold |
컴파일된 모델을 생성하지 마세요. 컴파일된 모델이 이미 생성되었을 때 사용됩니다. | |
--precompile-queries |
미리 컴파일된 쿼리를 생성합니다. 대상 프로젝트에 쿼리가 포함된 경우 NativeAOT 컴파일에 필요합니다. | |
--nativeaot |
NativeAOT 컴파일 및 미리 컴파일된 쿼리에 필요한 컴파일된 모델에 추가 코드 생성 |
참고
NativeAOT 지원 및 미리 컴파일된 쿼리는 EF 9에서 실험적인 것으로 간주되며 다음 릴리스에서 크게 변경될 수 있습니다.
일반적인 옵션은 위에 나열되어 있습니다.
다음 예제에서는 기본 설정을 사용하고 프로젝트에 하나의 DbContext
만 있는 경우 작동합니다.
dotnet ef dbcontext optimize
다음 예제에서는 지정된 이름의 컨텍스트에 대해 모델을 최적화하고 별도의 폴더 및 네임스페이스에 배치합니다.
dotnet ef dbcontext optimize -o Models -n BlogModels -c BlogContext
데이터베이스의 DbContext
및 엔터티 형식에 대한 코드를 생성합니다. 이 명령이 엔터티 형식을 생성하려면 데이터베이스 테이블에 기본 키가 있어야 합니다.
인수:
인수 | 설명 |
---|---|
<CONNECTION> |
데이터베이스에 대한 연결 문자열입니다. ASP.NET Core 2.x 프로젝트의 경우 값은 name=<연결 문자열의 이름>일 수 있습니다. 이 경우 이름은 프로젝트에 대해 설정된 구성 원본에서 가져옵니다. |
<PROVIDER> |
사용할 공급자입니다. 일반적으로 NuGet 패키지의 이름입니다(예: Microsoft.EntityFrameworkCore.SqlServer ). |
옵션:
옵션 | Short | 설명 |
---|---|---|
--data-annotations |
-d |
특성을 사용하여 모델을 구성합니다(가능한 경우). 이 옵션을 생략하면 흐름 API만 사용됩니다. |
--context <NAME> |
-c |
생성할 DbContext 클래스의 이름입니다. |
--context-dir <PATH> |
DbContext 클래스 파일을 넣을 디렉터리입니다. 경로는 프로젝트 디렉터리를 기준으로 합니다. 네임스페이스는 폴더 이름에서 파생됩니다. |
|
--context-namespace <NAMESPACE> |
생성된 DbContext 클래스에 사용할 네임스페이스입니다. 참고: --namespace 를 재정의합니다. |
|
--force |
-f |
기존 파일을 덮어씁니다. |
--output-dir <PATH> |
-o |
엔터티 클래스 파일을 넣을 디렉터리입니다. 경로는 프로젝트 디렉터리를 기준으로 합니다. |
--namespace <NAMESPACE> |
-n |
생성된 모든 클래스에 사용할 네임스페이스입니다. 기본값은 루트 네임스페이스 및 출력 디렉터리에서 생성됩니다. |
--schema <SCHEMA_NAME>... |
엔터티 형식을 생성할 테이블 및 뷰의 스키마입니다. 여러 스키마를 지정하려면 각 스키마에 대해 --schema 를 반복합니다. 이 옵션을 생략하면 모든 스키마가 포함됩니다. 이 옵션을 사용하면 --table을 사용하여 명시적으로 포함되지 않더라도 스키마의 모든 테이블과 뷰가 모델에 포함됩니다. |
|
--table <TABLE_NAME>... |
-t |
엔터티 형식을 생성할 테이블 및 뷰입니다. 여러 테이블을 지정하려면 각 테이블에 대해 -t 또는 --table 를 반복합니다. 특정 스키마의 테이블 또는 뷰는 'schema.table' 또는 'schema.view' 형식을 사용하여 포함할 수 있습니다. 이 옵션을 생략하면 모든 테이블과 뷰가 포함됩니다. |
--use-database-names |
테이블, 뷰, 시퀀스 및 열 이름이 데이터베이스에 표시되는 것과 똑같이 사용합니다. 이 옵션을 생략하면 데이터베이스 이름이 C# 이름 스타일 규칙을 더 밀접하게 준수하도록 변경됩니다. | |
--no-onconfiguring |
생성된 DbContext 클래스에서 OnConfiguring 메서드 생성을 표시하지 않습니다. |
|
--no-pluralize |
pluralizer를 사용하지 마세요. |
일반적인 옵션은 위에 나열되어 있습니다.
다음 예제에서는 모든 스키마와 테이블을 스캐폴드하고 새 파일을 Models 폴더에 배치합니다.
dotnet ef dbcontext scaffold "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models
다음 예제에서는 선택한 테이블만 스캐폴딩하고 지정된 이름과 네임스페이스를 사용하여 별도의 폴더에 컨텍스트를 만듭니다.
dotnet ef dbcontext scaffold "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models -t Blog -t Post --context-dir Context -c BlogContext --context-namespace New.Namespace
다음 예제에서는 비밀 관리자 도구를 사용하여 설정된 프로젝트 구성에서 연결 문자열을 읽습니다.
dotnet user-secrets set ConnectionStrings:Blogging "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Blogging"
dotnet ef dbcontext scaffold Name=ConnectionStrings:Blogging Microsoft.EntityFrameworkCore.SqlServer
다음 예제에서는 OnConfiguring
메서드 스캐폴딩을 건너뜁니다. 이는 클래스 외부에서 DbContext를 구성하려는 경우에 유용할 수 있습니다. 예를 들어 ASP.NET Core 앱은 일반적으로 Startup.ConfigureServices에서 구성합니다.
dotnet ef dbcontext scaffold "Server=(localdb)\mssqllocaldb;Database=Blogging;User Id=myUsername;Password=myPassword;" Microsoft.EntityFrameworkCore.SqlServer --no-onconfiguring
DbContext에서 SQL 스크립트를 생성합니다. 마이그레이션을 무시합니다.
옵션:
옵션 | Short | 설명 |
---|---|---|
--output <FILE> |
-o |
결과를 쓸 파일입니다. |
일반적인 옵션은 위에 나열되어 있습니다.
새 마이그레이션을 추가합니다.
인수:
인수 | 설명 |
---|---|
<NAME> |
마이그레이션의 이름입니다. |
옵션:
옵션 | Short | 설명 |
---|---|---|
--output-dir <PATH> |
-o |
디렉터리에서 를 사용하여 파일을 출력합니다. 경로는 대상 프로젝트 디렉터리를 기준으로 합니다. 기본값은 "마이그레이션"입니다. |
--namespace <NAMESPACE> |
-n |
생성된 클래스에 사용할 네임스페이스입니다. 출력 디렉터리에서 생성되는 기본값입니다. |
일반적인 옵션은 위에 나열되어 있습니다.
데이터베이스를 업데이트하는 실행 파일을 만듭니다.
옵션:
옵션 | Short | 설명 |
---|---|---|
--output <FILE> |
-o |
만들 실행 파일의 경로입니다. |
--force |
-f |
기존 파일을 덮어씁니다. |
--self-contained |
또한 컴퓨터에 설치할 필요가 없도록 .NET 런타임을 번들로 묶습니다. | |
--target-runtime <RUNTIME_IDENTIFIER> |
-r |
번들로 묶을 대상 런타임입니다. |
일반적인 옵션은 위에 나열되어 있습니다.
참고
이 명령은 EF Core 8.0에서 추가되었습니다.
마지막 마이그레이션 이후 모델이 변경되었는지 확인합니다.
옵션:
일반적인 옵션은 위에 나열되어 있습니다.
사용 가능한 마이그레이션을 나열합니다.
옵션:
옵션 | 설명 |
---|---|
--connection <CONNECTION> |
데이터베이스에 대한 연결 문자열입니다. 기본값은 AddDbContext 또는 OnConfiguring에 지정된 입니다. |
--no-connect |
데이터베이스에 연결하지 마세요. |
일반적인 옵션은 위에 나열되어 있습니다.
최근의 마이그레이션을 위해 수행된 코드 변경 내용을 롤백하여 마지막 마이그레이션을 제거합니다.
옵션:
옵션 | Short | 설명 |
---|---|---|
--force |
-f |
최신 마이그레이션을 되돌리고, 최신 마이그레이션을 위해 수행된 코드 및 데이터베이스 변경 내용을 모두 롤백합니다. 데이터베이스에 연결하는 동안 오류가 발생하는 경우 코드만 계속 롤백합니다. |
일반적인 옵션은 위에 나열되어 있습니다.
마이그레이션에서 SQL 스크립트를 생성합니다.
인수:
인수 | 설명 |
---|---|
<FROM> |
시작 마이그레이션입니다. 마이그레이션은 이름 또는 ID로 식별될 수 있습니다. 숫자 0은 첫 번째 마이그레이션 전을 의미하는 특별한 경우입니다. 기본값은 0입니다. |
<TO> |
종료 마이그레이션입니다. 기본값은 마지막 마이그레이션입니다. |
옵션:
옵션 | Short | 설명 |
---|---|---|
--output <FILE> |
-o |
스크립트를 쓸 파일입니다. |
--idempotent |
-i |
모든 마이그레이션 시 데이터베이스에서 사용할 수 있는 스크립트를 생성합니다. |
--no-transactions |
SQL 트랜잭션 문을 생성하지 마세요. |
일반적인 옵션은 위에 나열되어 있습니다.
다음 예제에서는 InitialCreate 마이그레이션에 대한 스크립트를 만듭니다.
dotnet ef migrations script 0 InitialCreate
다음 예제에서는 InitialCreate 마이그레이션 후의 모든 마이그레이션에 대한 스크립트를 만듭니다.
dotnet ef migrations script 20180904195021_InitialCreate
.NET 피드백
.NET은(는) 오픈 소스 프로젝트입니다. 다음 링크를 선택하여 피드백을 제공해 주세요.
학습
모듈
EF Core를 사용하여 관계형 데이터 유지 및 검색 - Training
이 모듈은 데이터 액세스 프로젝트를 만드는 단계를 안내합니다. EF Core(Entity Framework Core)를 사용하여 관계형 데이터베이스에 연결하고 CRUD(만들기, 읽기, 업데이트, 삭제) 쿼리를 구성합니다.