Answers:
就实体(或对象)而言,您有一个Class
对象的集合,Students
该Student
对象的集合和一个对象的集合Classes
。由于您的StudentClass
表仅包含ID,而没有其他信息,因此EF不会为联接表生成实体。这是正确的行为,这就是您的期望。
现在,在进行插入或更新时,请尝试根据对象进行思考。例如,如果您想插入一个有两个学生的课程,创建一个Class
对象,将这些Student
对象添加到班级Students
集合中,将Class
对象添加到上下文中并调用SaveChanges
:
using (var context = new YourContext())
{
var mathClass = new Class { Name = "Math" };
mathClass.Students.Add(new Student { Name = "Alice" });
mathClass.Students.Add(new Student { Name = "Bob" });
context.AddToClasses(mathClass);
context.SaveChanges();
}
这将在Class
表中创建一个条目,该表中的两个条目以及该Student
表中的两个条目StudentClass
将它们链接在一起。
基本上,您也需要进行相同的更新。只需获取数据,即可通过在集合中添加和删除对象来修改图形,请调用SaveChanges
。查看此类似问题以获取详细信息。
编辑:
根据您的评论,您需要插入一个新的Class
并添加两个现有的Students
:
using (var context = new YourContext())
{
var mathClass= new Class { Name = "Math" };
Student student1 = context.Students.FirstOrDefault(s => s.Name == "Alice");
Student student2 = context.Students.FirstOrDefault(s => s.Name == "Bob");
mathClass.Students.Add(student1);
mathClass.Students.Add(student2);
context.AddToClasses(mathClass);
context.SaveChanges();
}
由于这两个学生都已经在数据库中,因此不会插入他们,但是由于他们现在在的Students
集合中,因此Class
会将两个条目插入StudentClass
表中。
尝试使用此更新:
[HttpPost]
public ActionResult Edit(Models.MathClass mathClassModel)
{
//get current entry from db (db is context)
var item = db.Entry<Models.MathClass>(mathClassModel);
//change item state to modified
item.State = System.Data.Entity.EntityState.Modified;
//load existing items for ManyToMany collection
item.Collection(i => i.Students).Load();
//clear Student items
mathClassModel.Students.Clear();
//add Toner items
foreach (var studentId in mathClassModel.SelectedStudents)
{
var student = db.Student.Find(int.Parse(studentId));
mathClassModel.Students.Add(student);
}
if (ModelState.IsValid)
{
db.SaveChanges();
return RedirectToAction("Index");
}
return View(mathClassModel);
}
我使用以下方法来处理仅涉及外键的多对多关系。
所以对于插入:
public void InsertStudentClass (long studentId, long classId)
{
using (var context = new DatabaseContext())
{
Student student = new Student { StudentID = studentId };
context.Students.Add(student);
context.Students.Attach(student);
Class class = new Class { ClassID = classId };
context.Classes.Add(class);
context.Classes.Attach(class);
student.Classes = new List<Class>();
student.Classes.Add(class);
context.SaveChanges();
}
}
要删除,
public void DeleteStudentClass(long studentId, long classId)
{
Student student = context.Students.Include(x => x.Classes).Single(x => x.StudentID == studentId);
using (var context = new DatabaseContext())
{
context.Students.Attach(student);
Class classToDelete = student.Classes.Find(x => x.ClassID == classId);
if (classToDelete != null)
{
student.Classes.Remove(classToDelete);
context.SaveChanges();
}
}
}
在实体框架中,将对象添加到上下文时,其状态更改为“已添加”。EF还将每个对象的状态更改为要添加到对象树中,因此您将遇到主键冲突错误或表中添加了重复记录。