Entity-framework-database-operations
Entity Framework-データベース操作
前の章では、エンティティデータモデルを定義する3つの異なる方法を学びました。
- そのうちの2つ、Database FirstとModel Firstは、コード生成と組み合わせたEntity Frameworkデザイナーに依存していました。
- 3番目のコードファーストでは、ビジュアルデザイナーをスキップして、独自のコードを記述することができます。
- 選択するパスに関係なく、ドメインクラスになります。1つ以上のEntity Framework DbContextクラスを使用すると、それらのクラスに関連するデータを取得して永続化できます。
アプリケーションのDbContext APIは、クラスとデータベースの間のブリッジとして使用されます。 DbContextは、Entity Frameworkで最も重要なクラスの1つです。
- クエリを表現および実行できます。
- データベースからクエリ結果を取得し、それらをモデルクラスのインスタンスに変換します。
- 追加や削除など、エンティティへの変更を追跡し、必要に応じてデータベースに送信される挿入、更新、削除ステートメントの作成をトリガーします。
以下は、この章でさまざまな操作を実行するドメイン広告コンテキストクラスです。 これは、チャプタであるDatabase First Approachで作成したのと同じ例です。
コンテキストクラスの実装
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Core.Objects;
using System.Linq;
namespace DatabaseFirstDemo {
public partial class UniContextEntities : DbContext {
public UniContextEntities(): base("name = UniContextEntities") {}
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<Course> Courses { get; set; }
public virtual DbSet<Enrollment> Enrollments { get; set; }
public virtual DbSet<Student> Students { get; set; }
}
}
ドメインクラスの実装
コースクラス
namespace DatabaseFirstDemo {
using System;
using System.Collections.Generic;
public partial class Course {
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage",
"CA2214:DoNotCallOverridableMethodsInConstructors")]
public Course() {
this.Enrollments = new HashSet<Enrollment>();
}
public int CourseID { get; set; }
public string Title { get; set; }
public int Credits { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage",
"CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Enrollment> Enrollments { get; set; }
}
}
学生クラス
namespace DatabaseFirstDemo {
using System;
using System.Collections.Generic;
public partial class Student {
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage",
"CA2214:DoNotCallOverridableMethodsInConstructors")]
public Student() {
this.Enrollments = new HashSet<Enrollment>();
}
public int ID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public System.DateTime EnrollmentDate { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage",
"CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Enrollment> Enrollments { get; set; }
}
}
入学クラス
namespace DatabaseFirstDemo {
using System;
using System.Collections.Generic;
public partial class Enrollment {
public int EnrollmentID { get; set; }
public int CourseID { get; set; }
public int StudentID { get; set; }
public Nullable<int> Grade { get; set; }
public virtual Course Course { get; set; }
public virtual Student Student { get; set; }
}
}
操作を作成
Entity Frameworkで新しいオブジェクトを追加するには、オブジェクトの新しいインスタンスを作成し、DbSetのAddメソッドを使用して登録するだけです。 次のコードを使用すると、新しい学生をデータベースに追加できます。
class Program {
static void Main(string[] args) {
var newStudent = new Student();
//set student name
newStudent.FirstMidName = "Bill";
newStudent.LastName = "Gates";
newStudent.EnrollmentDate = DateTime.Parse("2015-10-21");
newStudent.ID = 100;
//create DBContext object
using (var dbCtx = new UniContextEntities()) {
//Add Student object into Students DBset
dbCtx.Students.Add(newStudent);
//call SaveChanges method to save student into database
dbCtx.SaveChanges();
}
}
}
更新操作
既存のオブジェクトの変更は、変更するプロパティに割り当てられた値を更新し、SaveChangesを呼び出すのと同じくらい簡単です。 たとえば、次のコードは、アリの姓をカーンからアスラムに変更するために使用されます。
using (var context = new UniContextEntities()) {
var student = (from d in context.Students where d.FirstMidName == "Ali" select d).Single();
student.LastName = "Aslam";
context.SaveChanges();
}
削除操作
Entity Frameworkを使用してエンティティを削除するには、DbSetのRemoveメソッドを使用します。 削除は、既存のエンティティと新しく追加されたエンティティの両方で機能します。 追加されたがまだデータベースに保存されていないエンティティに対してRemoveを呼び出すと、エンティティの追加がキャンセルされます。 エンティティは変更トラッカーから削除され、DbContextによって追跡されなくなります。 変更追跡されている既存のエンティティでRemoveを呼び出すと、次回SaveChangesが呼び出されたときに削除するエンティティが登録されます。 次の例は、学生が名がアリであるデータベースから削除されるコードです。
using (var context = new UniContextEntities()) {
var bay = (from d in context.Students where d.FirstMidName == "Ali" select d).Single();
context.Students.Remove(bay);
context.SaveChanges();
}
読み取り操作
データベースから既存のデータを読み取るのは非常に簡単です。 以下は、Studentテーブルからすべてのデータが取得され、アルファベット順に生徒の姓と名が表示されたプログラムが表示されるコードです。
using (var db = new UniContextEntities()) {
var query = from b in db.Students orderby b.FirstMidName select b;
Console.WriteLine("All All student in the database:");
foreach (var item in query) {
Console.WriteLine(item.FirstMidName +" "+ item.LastName);
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}