次の方法で共有


EF6 と EF Core の間の動作変更

これは、EF6 と EF Core の間の動作の変更の完全な一覧ではありません。 これらはアプリケーションの動作方法を変更する可能性がありますが、EF Core にスワップした後はコンパイル エラーとして表示されないため、アプリケーションのポートとして注意することが重要です。

これは、移植プロセスの一部として考慮する高レベルのレビューを意味します。 詳細なケース バイ ケースの手順については、 詳細なケースを参照してください。

DbSet.Add/Attach とグラフの動作

EF6 では、エンティティに対して DbSet.Add() を呼び出すと、そのナビゲーション プロパティで参照されているすべてのエンティティが再帰的に検索されます。 コンテキストによって検出され、まだ追跡されていないエンティティも、追加済みとしてマークされます。 DbSet.Attach() は同じように動作しますが、すべてのエンティティが変更されていないとマークされている点が異なります。

EF Core は同様の再帰的検索を実行しますが、規則は若干異なります。

  • 生成されたキーに対してルート エンティティが構成されていて、キーが設定されていない場合は、 Added 状態になります。
  • ナビゲーション プロパティの再帰的な検索中に見つかったエンティティの場合:
    • エンティティの主キーがストアで生成された場合
      • 主キーが値に設定されていない場合、状態は追加に設定されます。 プロパティ型の CLR 既定値が割り当てられている場合、主キー値は "設定されていません" と見なされます (たとえば、0intnullstringなど)。
      • 主キーが値に設定されている場合、状態は変更されません。
    • 主キーがデータベース生成されていない場合、エンティティはルートと同じ状態になります。
  • この動作の変更は、 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 プロパティがない場合は、クラス名が使用されます。

詳細については、「 データベース スキーマの管理」を参照してください。