Entity-framework-multiple-dbcontext
提供:Dev Guides
Entity Framework-複数のDbContext
この章では、アプリケーションに複数のDbContextクラスがある場合に、データベースに変更を移行する方法を学習します。
- 複数のDbContextは、Entity Framework 6.0で初めて導入されました。
- 複数のコンテキストクラスは、単一のデータベースまたは2つの異なるデータベースに属する場合があります。
この例では、同じデータベースに対して2つのContextクラスを定義します。 次のコードには、StudentとTeacherの2つのDbContextクラスがあります。
public class Student {
public int ID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public DateTime EnrollmentDate { get; set; }
}
public class MyStudentContext : DbContext {
public MyStudentContext() : base("UniContextDB") {}
public virtual DbSet<Student> Students { get; set; }
}
public class Teacher {
public int ID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public DateTime HireDate { get; set; }
}
public class MyTeacherContext : DbContext {
public MyTeacherContext() : base("UniContextDB") {}
public virtual DbSet<Teacher> Teachers { get; set; }
}
上記のコードを見るとわかるように、「学生」と「教師」という2つのモデルがあります。 それぞれが特定の対応するコンテキストクラスに関連付けられます。つまり、StudentはMyStudentContextに関連付けられ、TeacherはMyTeacherContextに関連付けられます。
同じプロジェクト内に複数のContextクラスがある場合、データベースの変更を移行するための基本的なルールを次に示します。
- enable-migrations -ContextTypeName <ネームスペース付きのDbContext-Name> MigrationsDirectory:<Migrations-Directory-Name>
- Add-Migration -configuration <DbContext-Migrations-Configuration-Class-withNamespaces> <Migrations-Name>
- Update-Database -configuration <DbContext-Migrations-Configuration-Class-withNamespaces> -Verbose
パッケージマネージャーコンソールで次のコマンドを実行して、MyStudentContextの移行を有効にしましょう。
PM→ enable-migrations -ContextTypeName:EFCodeFirstDemo.MyStudentContext
実行されたら、移行履歴にモデルを追加します。そのためには、同じコンソールでadd-migrationコマンドを実行する必要があります。
PM→ add-migration -configuration EFCodeFirstDemo.Migrations.Configuration Initial
ここで、データベース内のStudentテーブルとTeachersテーブルにデータを追加しましょう。
static void Main(string[] args) {
using (var context = new MyStudentContext()) {
////Create and save a new Students
Console.WriteLine("Adding new students");
var student = new Student {
FirstMidName = "Alain",
LastName = "Bomer",
EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
//Age = 24
};
context.Students.Add(student);
var student1 = new Student {
FirstMidName = "Mark",
LastName = "Upston",
EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
//Age = 30
};
context.Students.Add(student1);
context.SaveChanges();
//Display all Students from the database
var students = (from s in context.Students orderby s.FirstMidName
select s).ToList<Student>();
Console.WriteLine("Retrieve all Students from the database:");
foreach (var stdnt in students) {
string name = stdnt.FirstMidName + " " + stdnt.LastName;
Console.WriteLine("ID: {0}, Name: {1}", stdnt.ID, name);
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
using (var context = new MyTeacherContext()) {
////Create and save a new Teachers
Console.WriteLine("Adding new teachers");
var student = new Teacher {
FirstMidName = "Alain",
LastName = "Bomer",
HireDate = DateTime.Parse(DateTime.Today.ToString())
//Age = 24
};
context.Teachers.Add(student);
var student1 = new Teacher {
FirstMidName = "Mark",
LastName = "Upston",
HireDate = DateTime.Parse(DateTime.Today.ToString())
//Age = 30
};
context.Teachers.Add(student1);
context.SaveChanges();
//Display all Teachers from the database
var teachers = (from t in context.Teachers orderby t.FirstMidName
select t).ToList<Teacher>();
Console.WriteLine("Retrieve all teachers from the database:");
foreach (var teacher in teachers) {
string name = teacher.FirstMidName + " " + teacher.LastName;
Console.WriteLine("ID: {0}, Name: {1}", teacher.ID, name);
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
上記のコードを実行すると、次の図に示すように、2つの異なるモデルに対して2つの異なるテーブルが作成されていることがわかります。
理解を深めるために、上記の例を段階的に実行することをお勧めします。