리버스 엔지니어링Reverse Engineering

리버스 엔지니어링은 데이터베이스 스키마에 기반 하 여 엔터티 형식 클래스 및 DbContext 클래스를 스 캐 폴딩 하는 프로세스입니다.Reverse engineering is the process of scaffolding entity type classes and a DbContext class based on a database schema. Scaffold-DbContextEF CORE PMC (패키지 관리자 콘솔) 도구 또는 dotnet ef dbcontext scaffold .net CLI (명령줄 인터페이스) 도구의 명령을 사용 하 여이를 수행할 수 있습니다.It can be performed using the Scaffold-DbContext command of the EF Core Package Manager Console (PMC) tools or the dotnet ef dbcontext scaffold command of the .NET Command-line Interface (CLI) tools.

설치Installing

리버스 엔지니어링 하기 전에 PMC 도구 (Visual Studio에만 해당) 또는 CLI 도구를 설치 해야 합니다.Before reverse engineering, you'll need to install either the PMC tools (Visual Studio only) or the CLI tools. 자세한 내용은 링크를 참조 하세요.See links for details.

또한 리버스 엔지니어링할 데이터베이스 스키마에 적합 한 데이터베이스 공급자 를 설치 해야 합니다.You'll also need to install an appropriate database provider for the database schema you want to reverse engineer.

연결 문자열Connection string

명령의 첫 번째 인수는 데이터베이스에 대 한 연결 문자열입니다.The first argument to the command is a connection string to the database. 도구는이 연결 문자열을 사용 하 여 데이터베이스 스키마를 읽습니다.The tools will use this connection string to read the database schema.

연결 문자열의 따옴표 및 이스케이프는 명령을 실행 하는 데 사용 하는 셸에 따라 다릅니다.How you quote and escape the connection string depends on which shell you are using to execute the command. 자세한 내용은 셸 설명서를 참조 하세요.Refer to your shell's documentation for specifics. 예를 들어 PowerShell을 사용 하려면 $ 문자를 이스케이프 해야 \ 합니다.For example, PowerShell requires you to escape the $ character, but not \.

dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook" Microsoft.EntityFrameworkCore.SqlServer

구성 및 사용자 비밀Configuration and User Secrets

ASP.NET Core 프로젝트를 사용 하는 경우 구문을 사용 하 여 Name=<connection-string> 구성에서 연결 문자열을 읽을 수 있습니다.If you have an ASP.NET Core project, you can use the Name=<connection-string> syntax to read the connection string from configuration.

이는 암호 관리자 도구 를 사용 하 여 코드 베이스와 별도로 데이터베이스 암호를 유지 하는 데 효과적입니다.This works well with the Secret Manager tool to keep your database password separate from your codebase.

dotnet user-secrets set ConnectionStrings.Chinook "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook"
dotnet ef dbcontext scaffold Name=ConnectionStrings.Chinook Microsoft.EntityFrameworkCore.SqlServer

공급자 이름Provider name

두 번째 인수는 공급자 이름입니다.The second argument is the provider name. 공급자 이름은 일반적으로 공급자의 NuGet 패키지 이름과 동일 합니다.The provider name is typically the same as the provider's NuGet package name.

테이블 지정Specifying tables

데이터베이스 스키마의 모든 테이블은 기본적으로 엔터티 형식으로 리버스 엔지니어링 됩니다.All tables in the database schema are reverse engineered into entity types by default. 스키마와 테이블을 지정 하 여 리버스 엔지니어링 되는 테이블을 제한할 수 있습니다.You can limit which tables are reverse engineered by specifying schemas and tables.

--schema옵션은 --table 특정 테이블을 포함 하는 데 사용할 수 있지만 스키마 내의 모든 테이블을 포함 하는 데 사용할 수 있습니다.The --schema option can be used to include every table within a schema, while --table can be used to include specific tables.

여러 테이블을 포함 하려면 옵션을 여러 번 지정 합니다.To include multiple tables, specify the option multiple times:

dotnet ef dbcontext scaffold ... --table Artist --table Album

이름 유지Preserving names

테이블 및 열 이름은 기본적으로 형식 및 속성에 대 한 .NET 명명 규칙에 맞게 수정 됩니다.Table and column names are fixed up to better match the .NET naming conventions for types and properties by default. -UseDatabaseNamesPMC에 스위치를 지정 하거나 .NET Core CLI의 옵션을 지정 하면 --use-database-names 원래 데이터베이스 이름을 최대한 유지 하면서이 동작을 사용 하지 않도록 설정 합니다.Specifying the -UseDatabaseNames switch in PMC or the --use-database-names option in the .NET Core CLI will disable this behavior preserving the original database names as much as possible. 잘못 된 .NET 식별자는 계속 고정 되 고, 탐색 속성과 같은 합성 이름은 여전히 .NET 명명 규칙을 따릅니다.Invalid .NET identifiers will still be fixed and synthesized names like navigation properties will still conform to .NET naming conventions.

흐름 API 또는 데이터 주석Fluent API or Data Annotations

엔터티 형식은 기본적으로 흐름 API를 사용 하 여 구성 됩니다.Entity types are configured using the Fluent API by default. -DataAnnotations --data-annotations 가능 하면 데이터 주석을 대신 사용 하려면 (PMC) 또는 (.NET Core CLI)를 지정 합니다.Specify -DataAnnotations (PMC) or --data-annotations (.NET Core CLI) to instead use data annotations when possible.

예를 들어, 흐름 API를 사용 하면 다음과 같이 스 캐 폴드 됩니다.For example, using the Fluent API will scaffold this:

entity.Property(e => e.Title)
    .IsRequired()
    .HasMaxLength(160);

데이터 주석을 사용 하는 동안 다음과 같은 스 캐 폴드 됩니다.While using Data Annotations will scaffold this:

[Required]
[StringLength(160)]
public string Title { get; set; }

DbContext 이름DbContext name

스 캐 폴드 DbContext 클래스 이름은 기본적으로 컨텍스트가 접미사로 사용 되는 데이터베이스의 이름입니다.The scaffolded DbContext class name will be the name of the database suffixed with Context by default. 다른 항목을 지정 하려면 -Context PMC 및 .NET Core CLI에서를 사용 --context 합니다.To specify a different one, use -Context in PMC and --context in the .NET Core CLI.

디렉터리 및 네임 스페이스Directories and namespaces

엔터티 클래스와 DbContext 클래스는 프로젝트의 루트 디렉터리에 스 캐 폴드 프로젝트의 기본 네임 스페이스를 사용 합니다.The entity classes and a DbContext class are scaffolded into the project's root directory and use the project's default namespace.

클래스가를 사용 하 여 스 캐 폴드 디렉터리를 지정할 수 있으며,이 클래스를 사용 하 여 --output-dir --context-dir DbContext 클래스를 엔터티 형식 클래스와는 별도의 디렉터리에 스 캐 폴드 수 있습니다.You can specify the directory where classes are scaffolded using --output-dir, and --context-dir can be used to scaffold the DbContext class into a separate directory from the entity type classes:

dotnet ef dbcontext scaffold ... --context-dir Data --output-dir Models

기본적으로 네임 스페이스는 루트 네임 스페이스와 프로젝트의 루트 디렉터리에 있는 하위 디렉터리의 이름을 합한 것입니다.By default, the namespace will be the root namespace plus the names of any subdirectories under the project's root directory. 그러나 EFCore 5.0부터를 사용 하 여 모든 출력 클래스의 네임 스페이스를 재정의할 수 있습니다 --namespace .However, from EFCore 5.0 onwards, you can override the namespace for all output classes by using --namespace. 다음을 사용 하 여 DbContext 클래스에 대 한 네임 스페이스를 재정의할 수도 있습니다 --context-namespace .You can also override the namespace for just the DbContext class using --context-namespace:

dotnet ef dbcontext scaffold ... --namespace Your.Namespace --context-namespace Your.DbContext.Namespace

작동 방법How it works

리버스 엔지니어링은 데이터베이스 스키마를 읽어 시작 합니다.Reverse engineering starts by reading the database schema. 테이블, 열, 제약 조건 및 인덱스에 대 한 정보를 읽습니다.It reads information about tables, columns, constraints, and indexes.

그런 다음 스키마 정보를 사용 하 여 EF Core 모델을 만듭니다.Next, it uses the schema information to create an EF Core model. 테이블은 엔터티 형식을 만드는 데 사용 됩니다. 열은 속성을 만드는 데 사용 됩니다. 외래 키는 관계를 만드는 데 사용 됩니다.Tables are used to create entity types; columns are used to create properties; and foreign keys are used to create relationships.

마지막으로, 모델을 사용 하 여 코드를 생성 합니다.Finally, the model is used to generate code. 앱에서 동일한 모델을 다시 만들기 위해 해당 엔터티 형식 클래스, 흐름 API 및 데이터 주석이 스 캐 폴드 됩니다.The corresponding entity type classes, Fluent API, and data annotations are scaffolded in order to re-create the same model from your app.

제한 사항Limitations

  • 데이터베이스 스키마를 사용 하 여 모델에 대 한 모든 것을 나타낼 수 있는 것은 아닙니다.Not everything about a model can be represented using a database schema. 예를 들어 상속 계층 구조, 소유 된 형식테이블 분할 에 대 한 정보는 데이터베이스 스키마에 없습니다.For example, information about inheritance hierarchies, owned types, and table splitting are not present in the database schema. 이로 인해 이러한 구문은 리버스 엔지니어링 되지 않습니다.Because of this, these constructs will never be reverse engineered.
  • 또한 일부 열 형식은 EF Core 공급자에서 지원 되지 않을 수 있습니다.In addition, some column types may not be supported by the EF Core provider. 이러한 열은 모델에 포함 되지 않습니다.These columns won't be included in the model.
  • EF Core 모델에서 동시성 토큰을 정의 하 여 두 사용자가 동시에 동일한 엔터티를 업데이트 하지 못하게 할 수 있습니다.You can define concurrency tokens, in an EF Core model to prevent two users from updating the same entity at the same time. 일부 데이터베이스에는이 유형의 열을 나타내는 특수 한 형식 (예: SQL Server rowversion)이 있으며,이 경우이 정보를 리버스 엔지니어링할 수 있습니다. 그러나 다른 동시성 토큰은 리버스 엔지니어링 되지 않습니다.Some databases have a special type to represent this type of column (for example, rowversion in SQL Server) in which case we can reverse engineer this information; however, other concurrency tokens will not be reverse engineered.
  • C # 8 nullable 참조 형식 기능은 현재 리버스 엔지니어링에서 지원 되지 않습니다. EF Core 항상 기능을 사용할 수 없는 것으로 가정 하는 c # 코드를 생성 합니다.The C# 8 nullable reference type feature is currently unsupported in reverse engineering: EF Core always generates C# code that assumes the feature is disabled. 예를 들어 nullable 텍스트 열은 string string? 속성이 필수 인지 여부를 구성 하는 데 사용 되는 흐름 API 또는 데이터 주석을 사용 하지 않고 형식의 속성으로 스 캐 폴드 됩니다.For example, nullable text columns will be scaffolded as a property with type string , not string?, with either the Fluent API or Data Annotations used to configure whether a property is required or not. 스 캐 폴드 코드를 편집 하 여 c # Null 허용 주석으로 바꿀 수 있습니다.You can edit the scaffolded code and replace these with C# nullability annotations. Nullable 참조 형식에 대 한 스 캐 폴딩 지원은 #15520문제에 의해 추적 됩니다.Scaffolding support for nullable reference types is tracked by issue #15520.

모델 사용자 지정Customizing the model

EF Core에서 생성 되는 코드는 코드입니다.The code generated by EF Core is your code. 자유롭게 변경할 수 있습니다.Feel free to change it. 동일한 모델을 다시 리버스 엔지니어링 하는 경우에만 다시 생성 됩니다.It will only be regenerated if you reverse engineer the same model again. 스 캐 폴드 코드는 데이터베이스에 액세스 하는 데 사용할 수 있는 모델 하나 를 나타내지만 유일 하 게 사용할 수 있는 모델은 아닙니다.The scaffolded code represents one model that can be used to access the database, but it's certainly not the only model that can be used.

사용자의 요구에 맞게 엔터티 형식 클래스 및 DbContext 클래스를 사용자 지정 합니다.Customize the entity type classes and DbContext class to fit your needs. 예를 들어 형식 및 속성의 이름을 바꾸거나 상속 계층을 도입 하거나 테이블을 여러 엔터티로 분할 하도록 선택할 수 있습니다.For example, you may choose to rename types and properties, introduce inheritance hierarchies, or split a table into to multiple entities. 모델에서 고유 하지 않은 인덱스, 사용 되지 않는 시퀀스 및 탐색 속성, 선택적 스칼라 속성 및 제약 조건 이름을 제거할 수도 있습니다.You can also remove non-unique indexes, unused sequences and navigation properties, optional scalar properties, and constraint names from the model.

추가 생성자, 메서드, 속성 등을 추가할 수도 있습니다.You can also add additional constructors, methods, properties, etc. 별도의 파일에 다른 partial 클래스를 사용 합니다.using another partial class in a separate file. 이 방법은 모델을 다시 리버스 엔지니어링 하려는 경우에도 작동 합니다.This approach works even when you intend to reverse engineer the model again.

모델 업데이트Updating the model

데이터베이스를 변경한 후에는 해당 변경 내용을 반영 하도록 EF Core 모델을 업데이트 해야 할 수 있습니다.After making changes to the database, you may need to update your EF Core model to reflect those changes. 데이터베이스가 간단 하 게 변경 되는 경우 EF Core 모델을 수동으로 변경 하는 것이 가장 간편 합니다.If the database changes are simple, it may be easiest just to manually make the changes to your EF Core model. 예를 들어, 테이블 또는 열의 이름을 바꾸거나 열을 제거 하거나 열의 형식을 업데이트 하는 작업은 코드에서 변경 하는 것이 중요 합니다.For example, renaming a table or column, removing a column, or updating a column's type are trivial changes to make in code.

그러나 더 중요 한 변경 사항은 수동으로 설정 하기가 쉽지 않습니다.More significant changes, however, are not as easy make manually. 한 가지 일반적인 워크플로는 -Force (PMC) 또는 (CLI)를 사용 하 여 데이터베이스에서 모델을 다시 리버스 엔지니어링 하 여 --force 기존 모델을 업데이트 된 모델로 덮어쓰는 것입니다.One common workflow is to reverse engineer the model from the database again using -Force (PMC) or --force (CLI) to overwrite the existing model with an updated one.

일반적으로 요청 하는 또 다른 기능은 이름 바꾸기, 형식 계층 등의 사용자 지정을 유지 하면서 데이터베이스에서 모델을 업데이트 하는 기능입니다. 문제 #831 를 사용 하 여이 기능의 진행률을 추적할 수 있습니다.Another commonly requested feature is the ability to update the model from the database while preserving customization like renames, type hierarchies, etc. Use issue #831 to track the progress of this feature.

경고

데이터베이스에서 다시 모델을 리버스 엔지니어링 하는 경우 파일에 대 한 변경 내용이 모두 손실 됩니다.If you reverse engineer the model from the database again, any changes you've made to the files will be lost.