数日前から、Entity Framework (EF) を使用してデータベース交差テーブルにデータを挿入する方法について、Interwebz で情報を収集するために頭を悩ませています。私はすべての主要なプレーヤーの Web サイトとブログにアクセスしましたが、これを実行する方法に関する簡単な構文を提供した人はいません。突然、答えが私に浮かび、私が経験した痛みを軽減するために、これをできるだけ多くの人々と共有することを決意しました.
舞台を整えましょう。次のようなデータベース関係があるとします。
学生 (StudentID(PK), StudentName, Gender)
Courses (CourseID(PK), CourseName, CourseDescription)
StudentsCourses (StudentID(PK, FK), CourseID(PK, FK))
EF に精通している方は、上記のリレーションシップをエンティティ データ モデルに変換すると、Students テーブルと Courses テーブルはエンティティとして作成されますが、StudentCourses テーブルは作成されないことをご存知でしょう。これは、StudentCourses テーブルには他の 2 つのテーブルのキー以外の属性が含まれていないためです。したがって、EF は直接、Students と Courses の間の多対多の関係をマップします (EF は、この点でリレーショナル データベースの方法に制限されません)。 .) エンティティの代わりに、交差テーブルを AssociationSet に変換します。この動作を認識していない場合は、次のリンクで例を確認してください。
http://thedatafarm.com/blog/data-access/inserting-many-to-many-relationships-in-ef-with-or-without-a-join-entity/
http://weblogs.asp.net/ zeeshanhirani/archive/2008/08/21/多対多のエンティティのマッピング-framework.aspx
ここで、今学期の新しいコース (ENGL101、SOC102、および PHY100) に現在の学生 (ID:123456) を登録するとします。この場合、Students テーブルと Courses テーブルの既存の情報を使用して、StudentCourses テーブルに新しいレコードを挿入します。これらのテーブルはどちらもモデル内のエンティティであるため、どちらのテーブルのデータも簡単に操作できますが、StudentCourses テーブルはエンティティではないため、直接アクセスすることはできません。このジレンマの鍵は、各エンティティのナビゲーション プロパティにあります。Student エンティティには Course エンティティへのナビゲーション プロパティがあり、その逆もあります。これらを使用して、私が好きなように「関連付けの記録」を作成します。
既存の学生を既存のコースに関連付けるコード サンプルを次に示します。
using (var context = TheContext())
{
Student st = context.Students.Where(s => s.StudentID == “123456”).First();
st.Courses.Add(context.Courses.Where(c => c.CourseID == “ENGL101”).First());
st.Courses.Add(context.Courses.Where(c => c.CourseID == “SOC102”).First());
st.Courses.Add(context.Courses.Where(c => c.CourseID == “PHY100”).First());
context.Students.AddObject(st);
context.SaveChanges();
}
関連付けは双方向であるため、(CourseID によって) 3 つの Course オブジェクトを取得し、同じ Student オブジェクトをそれぞれに関連付けることができますが、私自身はテストしていません。必要以上のコードになり、意味的に混乱する可能性があると思います。
新しい学生を同じ既存のコースに関連付けるコード サンプルを次に示します。
using (var context = TheContext())
{
Student st = new Student({ StudentID = “654321”, StudentName = “Rudolph Reindeer”,
Gender = “Male” });
st.Courses.Add(context.Courses.Where(c => c.CourseID == “ENGL101”).First());
st.Courses.Add(context.Courses.Where(c => c.CourseID == “SOC102”).First());
st.Courses.Add(context.Courses.Where(c => c.CourseID == “PHY100”).First());
context.Students.AddObject(st);
context.SaveChanges();
}
最後に、新しい学生を新しいコースに関連付けるコードを次に示します (簡潔にするために「...」を使用)。
using (var context = TheContext())
{
Student st = new Student({ ... });
st.Courses.Add(new Course({ ... }));
st.Courses.Add(new Course({ ... }));
st.Courses.Add(new Course({ ... }));
context.Students.AddObject(st);
context.SaveChanges();
}