Entity Framework
EntityFrameworkによる継承(コードファースト)
サーチ…
階層ごとのテーブル
このアプローチは、すべての継承構造を表すためにデータベース上に1つのテーブルを生成します。
例:
public abstract class Person
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime BirthDate { get; set; }
}
public class Employee : Person
{
public DateTime AdmissionDate { get; set; }
public string JobDescription { get; set; }
}
public class Customer : Person
{
public DateTime LastPurchaseDate { get; set; }
public int TotalVisits { get; set; }
}
// On DbContext
public DbSet<Person> People { get; set; }
public DbSet<Employee> Employees { get; set; }
public DbSet<Customer> Customers { get; set; }
生成されるテーブルは次のようになります。
テーブル:Peopleフィールド:ID名前生年月日Discrimitator AdmissionDate JobDescription LastPurchaseDate TotalVisits
'Discriminator'は継承のサブクラスの名前を保持し、 'AdmissionDate'、 'JobDescription'、 'LastPurchaseDate'、 'TotalVisits'はnullにできます。
利点
- データベースは多くのページング操作を必要とすることがありますが、多くの列に対しては結合が必要ないため、パフォーマンスが向上します。
- シンプルで使いやすく作成する
- より多くのサブクラスとフィールドを簡単に追加できます
短所
- 第3正規形ウィキペディア違反:第3正規形
- ヌル可能なフィールドをたくさん作成する
テーブルの種類ごと
このアプローチでは、データベース上に(n + 1)個のテーブルが生成され、継承構造をすべて表します(nはサブクラスの数)。
の仕方:
public abstract class Person
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime BirthDate { get; set; }
}
[Table("Employees")]
public class Employee : Person
{
public DateTime AdmissionDate { get; set; }
public string JobDescription { get; set; }
}
[Table("Customers")]
public class Customer : Person
{
public DateTime LastPurchaseDate { get; set; }
public int TotalVisits { get; set; }
}
// On DbContext
public DbSet<Person> People { get; set; }
public DbSet<Employee> Employees { get; set; }
public DbSet<Customer> Customers { get; set; }
生成されるテーブルは次のようになります。
テーブル:Peopleフィールド:ID名前生年月日
表:従業員フィールド:PersonId AdmissionDate JobDescription
テーブル:顧客:フィールド:PersonId LastPurchaseDate TotalVisits
すべてのテーブルの 'PersonId'が主キーとなり、People.Idの制約になります
利点
- 正規化されたテーブル
- カラムやサブクラスの追加が簡単
- null可能な列はありません
短所
- データを取得するには結合が必要です
- サブクラスの推論はより高価です
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow