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つの異なるテーブルが作成されていることがわかります。

実行されたコード

理解を深めるために、上記の例を段階的に実行することをお勧めします。