MicrosoftのEntityFrameworkCoreは、その前身であるEntity Frameworkのクロスプラットフォーム、軽量、および柔軟なバージョンです。 EF Coreは、オブジェクトリレーショナルマッパー(ORM)ツールであり、さまざまなデータソースとの間でデータを保存および取得するための標準化された方法を提供します。
リレーショナルモデルではなく概念モデルに対してプログラミングする。その結果、アプリケーションでのデータの表現方法とデータベースでのデータの保存方法の間にインピーダンスの不一致はありません。
継承はオブジェクト指向プログラミングの機能であり、基本クラスからサブクラスを作成して、基本クラスの機能を拡張することができます。 Entity Framework Coreは、継承の優れたサポートを提供します。この記事では、EntityFrameworkCoreで継承を実装する方法について説明します。 EntityDeveloperを利用してデータベースと通信します。
前提条件
この記事で示したコード例を使用できるようにするには、システムに次のものをインストールする必要があります。
- Visual Studio 2019 Community Edition(ダウンロード)
- dotConnect for PostgreSQL(ダウンロード)
- エンティティ開発者
Entity Developer(試用版)のコピーは、https://www.devart.com/entitydeveloper/download.htmlからダウンロードできます。
データベースを作成する
これで、ASP.NET CoreWebAPIプロジェクトがVisualStudio2019で作成されました。次のステップは、データベースを作成することです。この例では、簡単にするために、単純な設計の2つのテーブルを含むデータベースを使用することに注意してください。 Demoというデータベースを作成し、その中に3つのテーブル(Person、User、およびManager)を作成します。これらのテーブルのフィールドは、この記事で後述するモデルクラスのプロパティにマップする必要があります。
新しいASP.NETCoreWebAPIプロジェクトを作成する
エンティティ開発者と連携するために必要なソフトウェアがコンピューターにインストールされていると仮定して、以下に概説する手順に従って、新しいASP.NET CoreWebAPIプロジェクトを作成します。
1.まず、Visual Studio2019IDEを開きます。
2.次に、[新しいプロジェクトを作成する]をクリックします IDEがロードされたら。
3.新しいプロジェクトの作成をクリックします 。
4.次に、 ASP.NETCoreWebアプリケーションを選択します 。
5.次へをクリックします 。
6.プロジェクト名と場所(システム内で保存する場所)を指定します。
7.必要に応じて、[ソリューションとプロジェクトを同じディレクトリに配置する]をクリックします チェックボックス。
8.次に、[作成]をクリックします 。
9.新しいASP.NETCoreWebアプリケーションの作成で 次に表示されるダイアログウィンドウで、 APIを選択します プロジェクトテンプレートとして。
10.バージョンとしてASP.NETCore3.1以降を選択します。
11.HTTPS用に構成を無効にする必要があります およびDockerサポートを有効にする それぞれのチェックボックスを無効にすることによるオプション。
12.この例では認証を使用しないため、認証を認証なしとして指定します。 。
13.最後に、作成をクリックします ボタンをクリックしてプロセスを終了します。
エンティティデータモデルを作成する
次に行うべきことは、エンティティデータモデルを作成することです。 Entity Developerでモデルを作成する場合、データベースファースト(デフォルトで選択されています)とモデルファーストの2つのオプションから選択できます。この例では、データベースファーストのアプローチを利用します。 データベースから生成を選択することを忘れないでください データベースからモデルを生成し、エンティティデータモデルの一部にしたいデータベースオブジェクトを選択するオプション。
以下に概説する手順に従って、データベースファーストのアプローチを使用してEntityDeveloperでエンティティデータモデルを作成します。
1.ソリューションエクスプローラーでプロジェクトを選択します 窓。
2.右クリックして、追加を選択します>新しいアイテム 。
3. DevartEFコアモデルを選択します 以下に示すようにテンプレートとして。
4。エンティティデータモデルの名前を指定して、[追加]をクリックします 。
5.接続プロパティを指定し、接続をテストします。
6.次へをクリックします 続ける。
7.デフォルトでは、「データベースから生成」オプションが選択されています。データベースからモデルを作成する必要があるため、[次へ]をクリックします 続ける。
8.すべてのオプションの選択を解除してから、モデルの一部にしたいデータベースオブジェクトのみを指定します。ここで、ProductsテーブルとCategoriesテーブルを選択する必要があります。
9.セットアップで 命名規則 画面では、オプションでエンティティの命名規則を指定できます。
10.次の画面で、オプションでモデルのプロパティを指定できます。
11.次の画面で、オプションでモデル図の内容を選択できます。
12.次の画面で、オプションでコード生成テンプレートを指定できます。
13.選択したコード生成テンプレートを指定します。
14.最後に、[完了]をクリックします プロセスを完了します。
Entity Developerを使用したADO.NETエンティティデータモデルは、データコンテキストとモデルクラスとともに作成されます。
EntityFrameworkCoreでの継承
Entity Framework Core(EF Core)を使用すると、.NETクラス階層をデータベースにマップできます。したがって、基本型と派生型として表される.NETエンティティを作成でき、EFCoreがデータベーススキーマを生成できます。ただし、EF Coreは基本クラスまたは派生クラスを自動的に検索しないため、モデルをマッピングする場合は、モデルでCLRタイプを明示的に宣言する必要があります。基本タイプのみを指定するだけでは不十分であることに注意してください。つまり、EFCoreにすべてのサブタイプが自動的に含まれるわけではありません。
次のコードリストは、クラスとそのサブクラスのカスタムデータコンテキストを作成する方法を示しています。
public class DemoDbContext : DbContext {
public DbSet<Person> Person { get; set; }
public DbSet<Author> Authors { get; set; }
}
public class Person {
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class Author : Person {
public string SubjectArea { get; set; }
}
階層ごとのテーブル(TPH)
Table Per Hierarchy(TPH)タイプの継承(これはEF Coreのデフォルトの継承タイプです)では、すべてのクラスを表すために、階層全体に対して1つのテーブルしかありません。異なるタイプを区別するために、「ディスクリミネーター」列が使用されます。デフォルトでは、テーブルは基本クラスまたはそれにリンクされたDbSetフィールドにちなんで名付けられます。テーブルの名前は、デフォルトでは基本クラスまたはそれに対応するDbSet属性の名前になります。
次のコードスニペットは、階層ごとのテーブルを表す方法を示しています。
public abstract class Person {
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class User : Person {
public string UserName { get; set; }
public string Password { get; set; }
}
public class Manager : Person {
public string Department { get; set; }
}
タイプごとのテーブル(TPT)
Table Per Type(TPT)アプローチの継承関係は、外部キーとして表されます。このアプローチでは、個別のテーブルが継承チェーンの各タイプ(抽象タイプを含む)を表します。外部キーは、派生型タイプを表すテーブルをそれらの基本タイプにリンクするために使用されます。この戦略では、EF Coreはデータベースにベーステーブルを作成し、各派生タイプに固有の複数のテーブルを作成します。
次のコードリストは、Table Per Type(TPT)アプローチを実装する方法を示しています。
public abstract class Person {
public int Id { get; set; }
public string FullName { get; set; }
}
[Table("Users")]
public class User : Person {
public string UserName { get; set; }
public string Password { get; set; }
}
[Table("Managers")]
public class Manager : Person {
public string Department { get; set; }
}
コンクリートタイプごとのテーブル(TPC)
Table Per Concrete Type(TPC)アプローチでは、継承チェーンの各コンクリートタイプは、データベース内の個別のテーブルで表されますが、抽象クラスでは表されません。抽象基本タイプのプロパティは、各具象タイプのテーブルのフィールドとして作成されます。
クラスのデザインはTPHと同じになります。サブクラスごとにテーブルを指定する方法は次のとおりです。
public class MyDbContext : DbContext {
public DbSet<Person> Person { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.Entity<User>().Map(m => {
m.MapInheritedProperties();
m.ToTable("Users");
});
modelBuilder.Entity<Author>().Map(m => {
m.MapInheritedProperties();
m.ToTable("Managers");
});
}
}
概要
Entity Framework Coreは、.NETStandard2.1をサポートする任意のプラットフォームで実行できます。これには、.NET Core3.1と.NET5が含まれます。ただし、.NET Standard 2.0では実行されません。つまり、EF Core 5.0以降、.NETFrameworkでEFCoreを利用できなくなります。読んで幸せです!