リバース エンジニアリングReverse Engineering

リバースエンジニアリングは、データベーススキーマに基づいてエンティティ型クラスおよび DbContext クラスをスキャフォールディングするプロセスです。Reverse engineering is the process of scaffolding entity type classes and a DbContext class based on a database schema. これは、 Scaffold-DbContext EF 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

2番目の引数はプロバイダー名です。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. PMC でスイッチを指定するか .NET Core CLI でオプションを指定すると、 -UseDatabaseNames --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.

Fluent API またはデータ注釈Fluent API or Data Annotations

エンティティ型は、既定では Fluent API を使用して構成されます。Entity types are configured using the Fluent API by default. -DataAnnotations可能な場合は、(PMC) または --data-annotations (.NET Core CLI) を指定して、代わりにデータ注釈を使用します。Specify -DataAnnotations (PMC) or --data-annotations (.NET Core CLI) to instead use data annotations when possible.

たとえば、Fluent 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. 別のものを指定するには、PMC でを使用し、.NET Core CLI でを使用し -Context --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. 対応するエンティティ型クラス、Fluent 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 モデルで 同時実行トークンを定義して、2人のユーザーが同時に同じエンティティを更新できないようにすることができます。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. たとえば、null 値が許容されるテキスト列は、 string string? プロパティが必須かどうかを構成するために使用される Fluent 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. Null 許容型参照型のスキャフォールディングサポートは、 #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. スキャフォールディングコードは、データベースへのアクセスに使用できる 1 つ のモデルを表しますが、使用できる 唯一 のモデルであるとは限りません。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. 別のファイルで別の部分クラスを使用しています。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 to make manually. 一般的なワークフローの1つは、 -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.

一般的に要求されるもう1つの機能は、名前変更、型階層などのカスタマイズを維持しながら、データベースからモデルを更新する機能です。この機能の進行状況を追跡するには、[問題 #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.