これは、EF6 と EF Core の間の動作の変更の完全な一覧ではありません。 これらはアプリケーションの動作方法を変更する可能性がありますが、EF Core にスワップした後はコンパイル エラーとして表示されないため、アプリケーションのポートとして注意することが重要です。
これは、移植プロセスの一部として考慮する高レベルのレビューを意味します。 詳細なケース バイ ケースの手順については、 詳細なケースを参照してください。
DbSet.Add/Attach とグラフの動作
EF6 では、エンティティに対して DbSet.Add() を呼び出すと、そのナビゲーション プロパティで参照されているすべてのエンティティが再帰的に検索されます。 コンテキストによって検出され、まだ追跡されていないエンティティも、追加済みとしてマークされます。
DbSet.Attach() は同じように動作しますが、すべてのエンティティが変更されていないとマークされている点が異なります。
EF Core は同様の再帰的検索を実行しますが、規則は若干異なります。
- 生成されたキーに対してルート エンティティが構成されていて、キーが設定されていない場合は、
Added状態になります。 -
ナビゲーション プロパティの再帰的な検索中に見つかったエンティティの場合:
-
エンティティの主キーがストアで生成された場合
- 主キーが値に設定されていない場合、状態は追加に設定されます。 プロパティ型の CLR 既定値が割り当てられている場合、主キー値は "設定されていません" と見なされます (たとえば、
0のint、nullのstringなど)。 - 主キーが値に設定されている場合、状態は変更されません。
- 主キーが値に設定されていない場合、状態は追加に設定されます。 プロパティ型の CLR 既定値が割り当てられている場合、主キー値は "設定されていません" と見なされます (たとえば、
- 主キーがデータベース生成されていない場合、エンティティはルートと同じ状態になります。
-
エンティティの主キーがストアで生成された場合
- この動作の変更は、
AttachおよびUpdateメソッド グループにのみ適用されます。Addキーが設定されている場合でも、エンティティは常にAdded状態になります。 -
Attachメソッドは、キーが設定されたエンティティをUnchanged状態にします。 これにより、"新しい場合は挿入する、それ以外の場合はそのままにする" のが容易になりますUpdateメソッドは、キーが設定されたエンティティをModified状態にします。 これにより、"新しい場合は挿入し、それ以外の場合は更新する" のが容易になります。
ここでの一般的な哲学は、 Update は、切断されたエンティティの挿入と更新を処理する非常に簡単な方法です。 これにより、新しいエンティティが挿入され、既存のエンティティが更新されます。
同時に、 Add はエンティティを挿入する簡単な方法を提供します。 Add は、エンティティが新しいかどうかを EF が認識しないように、ストアで生成されたキーを使用しない場合にのみ役立ちます。
EF Core でのこれらの動作の詳細については、「EF Core での 変更の追跡」を参照してください。
Code First データベースの初期化
EF6 には、データベース接続の選択とデータベースの初期化に関して実行される大量のマジックがあります。 これらの規則には、次のようなものがあります。
- 構成が実行されない場合、EF6 は SQL Express または LocalDb 上のデータベースを選択します。
- コンテキストと同じ名前の接続文字列がアプリケーションの
App/Web.configファイルにある場合は、この接続が使用されます。 - データベースが存在しない場合は作成されます。
- モデルのテーブルがデータベースに存在しない場合、現在のモデルのスキーマがデータベースに追加されます。 移行が有効になっている場合は、データベースの作成に使用されます。
- データベースが存在し、EF6 が以前にスキーマを作成していた場合は、スキーマが現在のモデルとの互換性をチェックされます。 スキーマの作成後にモデルが変更された場合、例外が発生します。
EF Core では、このマジックは実行されません。
- データベース接続は、コードで明示的に構成する必要があります。
- 初期化は実行されません。 移行を適用するには
DbContext.Database.Migrate()を使用する必要があります (または、移行を使用せずにデータベースを作成または削除するには、DbContext.Database.EnsureCreated()とEnsureDeleted()を使用する必要があります)。
Code First テーブルの名前付け規則
EF6 は、複数形化サービスを通じてエンティティ クラス名を実行し、エンティティがマップされる既定のテーブル名を計算します。
EF Core では、エンティティが派生コンテキストで公開される DbSet プロパティの名前を使用します。 エンティティに DbSet プロパティがない場合は、クラス名が使用されます。
詳細については、「 データベース スキーマの管理」を参照してください。
.NET