EF6 から EF コアへの移植する前に: アプリケーションの要件の検証Before porting from EF6 to EF Core: Validate your Application's Requirements

移植のプロセスを開始する前に、EF コアが、アプリケーションのデータ アクセス要件を満たしていることを検証する必要があります。Before you start the porting process it is important to validate that EF Core meets the data access requirements for your application.

足りない機能Missing features

EF 中核となるすべての機能をアプリケーションで使用する必要があることを確認してください。Make sure that EF Core has all the features you need to use in your application. 参照してください機能の比較EF6 に EF のコア機能を比較する方法の詳細な比較についてはします。See Feature Comparison for a detailed comparison of how the feature set in EF Core compares to EF6. 任意の必要な機能が不足している場合は、EF コアへの移植する前にこれらの機能の欠落を補うことができますを確認します。If any required features are missing, ensure that you can compensate for the lack of these features before porting to EF Core.

動作の変更Behavior changes

これは、網羅 EF6 と EF コア間の動作のいくつかの変更の一覧です。This is a non-exhaustive list of some changes in behavior between EF6 and EF Core. 保持する以下の点に、ポートとして、アプリケーション、アプリケーションの動作は表示されませんコンパイル エラーとしてスワップすると、EF コアに方法が変わる可能性がある重要です。It is important to keep these in mind as your port your application as they may change the way your application behaves, but will not show up as compilation errors after swapping to EF Core.

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

EF6 でを呼び出すDbSet.Add()ナビゲーション プロパティで参照されているすべてのエンティティの再帰的な検索で、エンティティの結果にします。In EF6, calling DbSet.Add() on an entity results in a recursive search for all entities referenced in its navigation properties. 任意のエンティティが検出され、コンテキストによって既に追跡されていないにも追加としてマークされます。Any entities that are found, and are not already tracked by the context, are also be marked as added. DbSet.Attach()すべてのエンティティがマークされている以外の動作は同じで、変更します。DbSet.Attach() behaves the same, except all entities are marked as unchanged.

EF コアのような再帰検索を実行するが、若干異なるルールがいくつか。EF Core performs a similar recursive search, but with some slightly different rules.

  • ルート エンティティが要求された状態では常に (の追加DbSet.Add変更しなかったとDbSet.Attach)。The root entity is always in the requested state (added for DbSet.Add and unchanged for DbSet.Attach).

  • エンティティのナビゲーション プロパティの再帰検索中に存在します。For entities that are found during the recursive search of navigation properties:

    • エンティティの主キーがストアで生成された場合If the primary key of the entity is store generated

      • 主キーが値に設定されていない場合、状態が追加に設定されます。If the primary key is not set to a value, the state is set to added. 主キーの値と見なされます「未設定」プロパティの型の CLR の既定値が割り当てられます (つまり0intnullstring, などです。)。The primary key value is considered "not set" if it is assigned the CLR default value for the property type (i.e. 0 for int, null for string, etc.).

      • 主キーが値に設定されている場合、状態に設定変更されません。If the primary key is set to a value, the state is set to unchanged.

    • 主キーは、生成されたデータベースではありません、エンティティは、ルートと同じ状態で配置されます。If the primary key is not database generated, the entity is put in the same state as the root.

コードの最初のデータベースの初期化Code First database initialization

EF6 膨大な量のデータベース接続を選択すると、データベースの初期化を実行するマジックがあります。これらのルールのとおりです。EF6 has a significant amount of magic it performs around selecting the database connection and initializing the database. Some of these rules include:

  • 構成が行われない場合、EF6 は SQL Express または LocalDb にデータベースを選択します。If no configuration is performed, EF6 will select a database on SQL Express or LocalDb.

  • コンテキストと同じ名前で接続文字列が、アプリケーションの場合App/Web.configファイルでは、この接続が使用されます。If a connection string with the same name as the context is in the applications App/Web.config file, this connection will be used.

  • データベースが存在しない場合は作成されます。If the database does not exist, it is created.

  • 存在しない場合、テーブル モデルからのデータベースでは、現在のモデルのスキーマがデータベースに追加されます。If none of the tables from the model exist in the database, the schema for the current model is added to the database. 移行が有効な場合は、データベースの作成が使用されます。If migrations are enabled, then they are used to create the database.

  • データベースが存在するし、EF6 以前に作成した、スキーマ、スキーマが現在のモデルとの互換性チェックされます。If the database exists and EF6 had previously created the schema, then the schema is checked for compatibility with the current model. スキーマが作成されたため、モデルが変更された場合、例外がスローされます。An exception is thrown if the model has changed since the schema was created.

この秘密のいずれかの EF コアは実行されません。EF Core does not perform any of this magic.

  • コードでは、データベース接続を明示的に構成する必要があります。The database connection must be explicitly configured in code.

  • 初期化は実行されません。No initialization is performed. 使用する必要がありますDbContext.Database.Migrate()移行を適用する (またはDbContext.Database.EnsureCreated()EnsureDeleted()への移行を使用せず、データベースの作成/削除) します。You must use DbContext.Database.Migrate() to apply migrations (or DbContext.Database.EnsureCreated() and EnsureDeleted() to create/delete the database without using migrations).

コードの最初のテーブルの名前付け規則Code First table naming convention

EF6 には、エンティティにマップされる既定のテーブル名を計算する複数形化サービスからエンティティ クラス名が実行されます。EF6 runs the entity class name through a pluralization service to calculate the default table name that the entity is mapped to.

名前を使用する EF コア、DbSet派生のコンテキストにエンティティが公開されているプロパティ。EF Core uses the name of the DbSet property that the entity is exposed in on the derived context. エンティティがない場合、DbSetプロパティ後でクラス名を使用します。If the entity does not have a DbSet property, then the class name is used.