Entity-framework-inheritance
提供:Dev Guides
エンティティフレームワーク - 継承
継承により、開発者の考え方をより適切に反映する複雑なモデルを作成でき、これらのモデルとのやり取りに必要な作業も削減できます。 エンティティで使用される継承は、クラスで使用される継承と同じ目的を果たすため、開発者はこの機能の動作の基本をすでに知っています。
次の例を見て、新しいコンソールアプリケーションプロジェクトを作成してみましょう。
- ステップ1 *-プロジェクト名を右クリックしてADO.NETエンティティデータモデルを追加し、[追加]→[新しいアイテム]を選択します…
- ステップ2 *-1つのエンティティを追加し、Model Firstアプローチの章に記載されているすべてのステップに従ってPersonという名前を付けます。
- ステップ3 *-次の画像に示すように、いくつかのスカラープロパティを追加します。
ステップ4 *-さらに2つのエンティティ *Student および Teacher を追加し、Person Tableからプロパティを継承します。
- ステップ5 *-次の図に示すように、Studentエンティティを追加し、BaseタイプコンボボックスからPersonを選択します。
- ステップ6 *-同様に、教師エンティティを追加します。
- ステップ7 *-EnrollmentDateスカラープロパティを学生エンティティに、HireDateプロパティを教師エンティティに追加します。
- ステップ8 *-先に進んでデータベースを生成しましょう。
- ステップ9 *-デザイン画面を右クリックし、[モデルからデータベースを生成…]を選択します
- ステップ10 *-新しいデータベースを作成するには、[新しい接続]をクリックします。次のダイアログが開きます。 OKをクリックしてください。
ステップ11 *-[完了]をクリックします。 これにより、プロジェクトに .edmx.sqlファイルが追加されます。 .sqlファイルを開くことにより、Visual StudioでDDLスクリプトを実行できます。 次に、右クリックして「実行」を選択します。
- ステップ12 *-サーバーエクスプローラーに移動すると、指定された3つのテーブルでデータベースが作成されていることがわかります。
- ステップ13 *-次のドメインクラスも自動的に生成されることもわかります。
public partial class Person {
public int ID { get; set; }
public string FirstMidName { get; set; }
public string LastName { get; set; }
}
public partial class Student : Person {
public System.DateTime EnrollmentDate { get; set; }
}
public partial class Teacher : Person {
public System.DateTime HireDate { get; set; }
}
以下は、Contextクラスです。
public partial class InheritanceModelContainer : DbContext {
public InheritanceModelContainer() :
base("name = InheritanceModelContainer") {}
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<Person> People { get; set; }
}
データベースに生徒と教師を追加して、データベースから取得します。
class Program {
static void Main(string[] args) {
using (var context = new InheritanceModelContainer()) {
var student = new Student {
FirstMidName = "Meredith",
LastName = "Alonso",
EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
};
context.People.Add(student);
var student1 = new Student {
FirstMidName = "Arturo",
LastName = "Anand",
EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
};
context.People.Add(student1);
var techaer = new Teacher {
FirstMidName = "Peggy",
LastName = "Justice",
HireDate = DateTime.Parse(DateTime.Today.ToString())
};
context.People.Add(techaer);
var techaer1 = new Teacher {
FirstMidName = "Yan",
LastName = "Li",
HireDate = DateTime.Parse(DateTime.Today.ToString())
};
context.People.Add(techaer1);
context.SaveChanges();
}
}
}
生徒と教師がデータベースに追加されます。 NToは生徒と教師を取得します。 OfType メソッドを使用する必要があります。これは、指定された部門に関連する生徒と教師を返します。
Console.WriteLine("All students in database");
Console.WriteLine("");
foreach (var student in context.People.OfType<Student>()) {
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID: {0}, Name: {1}, \tEnrollment Date {2} ",
student.ID, name, student.EnrollmentDate.ToString());
}
Console.WriteLine("");
Console.WriteLine("************************************************************ *****");
Console.WriteLine("");
Console.WriteLine("All teachers in database");
Console.WriteLine("");
foreach (var teacher in context.People.OfType<Teacher>()) {
string name = teacher.FirstMidName + " " + teacher.LastName;
Console.WriteLine("ID: {0}, Name: {1}, \tHireDate {2} ",
teacher.ID, name, teacher.HireDate.ToString());
}
Console.WriteLine("");
Console.WriteLine("************************************************************ *****");
Console.ReadKey();
最初のクエリで、OfType <Student>()を使用すると、HireDateプロパティはTeacher Entityの一部であり、同様にOfType <Teacher>()を使用するとEnrollmentDateプロパティにアクセスできないため、HireDateにアクセスできません
上記のコードが実行されると、次の出力が表示されます-
All students in database
ID: 1, Name: Meredith Alonso, Enrollment Date 10/30/2015 12:00:00 AM
ID: 2, Name: Arturo Anand, Enrollment Date 10/30/2015 12:00:00 AM
*****************************************************************
All teachers in database
ID: 3, Name: Peggy Justice, HireDate 10/30/2015 12:00:00 AM
ID: 4, Name: Yan Li, HireDate 10/30/2015 12:00:00 AM
*****************************************************************
理解を深めるために、上記の例を段階的に実行することをお勧めします。