Entity framework 4 删除/更新多对多实体框架。无法让它工作

Entity framework 4 删除/更新多对多实体框架。无法让它工作,entity-framework-4,entity,Entity Framework 4,Entity,我正在使用EF4,并且在项目的多对多更新和删除方面存在问题。 我很高兴插入,但更新和删除无法解决它 ClassID-ClassName 假设我有3个表和3个匹配的dto类 ClassID-ClassName 课桌 ClassID-ClassName 学生桌 ClassID-ClassName StudentID-StudentName 学生课表 ClassID-ClassName StudentID-ClassID ///H

我正在使用EF4,并且在项目的多对多更新和删除方面存在问题。 我很高兴插入,但更新和删除无法解决它

   ClassID-ClassName 
假设我有3个表和3个匹配的dto类

   ClassID-ClassName 
  • 课桌

       ClassID-ClassName 
    
  • 学生桌

       ClassID-ClassName 
    
       StudentID-StudentName
    
  • 学生课表

       ClassID-ClassName 
    
       StudentID-ClassID
    
    
    ///Happy all works I am using existing students to populate the class. Fine.
    private void InsertClassRoom(ClassRoomDto classRoomDto)
    {
        using (var ctx = new TrainingContext())
        {
            //Convert dto to Entity
            var classRoomEntity = new ClassRoom { ClassID = classRoomDto.ClassId, ClassName = classRoomDto.ClassName };
            foreach (var studentInClass in classRoomDto.Students)
            {
                Student student = ctx.Students.Where(x => x.StudentID == studentInClass.StudentId).SingleOrDefault();
                classRoomEntity.Students.Add(student);
            }
            ctx.AddToClassRooms(classRoomEntity);
            ctx.SaveChanges();
        }
    }
    
  • 但我有两个场景无法确定该做什么

       ClassID-ClassName 
    
  • 更新教室名称
  • 增加1名学生
  • 更新1名学生的姓名
  • 从课堂上删除学生。
    我该怎么做

       ClassID-ClassName 
    
    这是我的更新尝试:

       ClassID-ClassName 
    
    private void UpdateClassRoom(ClassRoomDto classRoomDto)
    {
        using (var ctx = new TrainingContext())
        {
            var classRoomEntity = new ClassRoom { ClassID = classRoomDto.ClassId, ClassName = classRoomDto.ClassName };
            foreach (var studentDto in classRoomDto.Students)
            {
                if (studentDto.StudentId == 0)
                {
                    //it's a new student add it to the classroom
                    Student student = new Student { StudentID = studentDto.StudentId, StudentName = studentDto.StudentName };
                    classRoomEntity.Students.Add(student);
                }
                else
                {
                    //Alter name of the student
                    Student student = ctx.Students.Where(x => x.StudentID == studentDto.StudentId).SingleOrDefault();
                    //update name
                    student.StudentName = studentDto.StudentName;
                    //? what do I do finish this attach or ???
               }
            }
            ctx.AddToClassRooms(classRoomEntity);
            ctx.SaveChanges();
        }
    }
    
    public void DeleteStudent(ClassRoomDto classRoomDto)
    {
        using (var ctx = new TrainingContext())
        {
            //lost on how to delete a student in  many to many 
        }
    }
    

    首先,我假设您知道数据库中已经存在教室。最简单的方法是先查询它。实际上,插入新的
    课堂
    条目的原因是您使用了
    ctx.AddToClassRooms(classRoomEntry)
    。这会将实体附加到上下文,并将
    EntityState
    设置为
    Added

       ClassID-ClassName 
    
    private void UpdateClassRoom(ClassRoomDto classRoomDto)
    {
        using (var ctx = new TrainingContext())
        {
            ClassRoom classRoomEntity = ctx.
                                        ClassRooms.
                                        Include("Students").
                                        Single(c => c.ClassID == classRoomDto.ClassId);
            classRoomEntity.ClassName = classRoomDto.ClassName;
    
            foreach (var studentDto in classRoomDto.Students)
            {
                if (studentDto.StudentId == 0)
                {
                    // it's a new student add it to the classroom
                    Student student = new Student
                                          {
                                              StudentID = studentDto.StudentId,
                                              StudentName = studentDto.StudentName
                                          };
                    classRoomEntity.Students.Add(student);
                }
                else
                {
                    // Student exists in the DB, but you don't know whether it's 
                    // already part of the student collection for the classroom
                    Student student = classRoomEntity.
                                      Students.
                                      FirstOrDefault(s => s.StudentID == studentDto.StudentId);
    
                    if (student == null)
                    {
                        // this student is not in the class, fetch it from the DB
                        // and add to the classroom
                        student = ctx.
                                  Students.
                                  SingleOrDefault(s => s.StudentID == studentDto.StudentId)
    
                        classRoomEntity.Students.Add(student);
                    }
    
                    // Update name
                    student.StudentName = studentDto.StudentName;
                    // Since student is now part of the classroom student collection
                    // and classroom IS attached => student is also attached
                }
            }
    
            ctx.SaveChanges();
        }
    }
    
    要从thr类中删除学生,只需将其从集合中删除(但不要调用
    ctx.DeleteObject())
    ,因为这将从数据库中删除该学生。在您的情况下,上面的代码不会处理此问题,因为它只会添加新学生。您可以采取更简单的方法,而不是匹配数据库中但不在DTO中的所有学生。先清除列表,然后添加学生:

       ClassID-ClassName 
    
    private void UpdateClassRoom(ClassRoomDto classRoomDto)
    {
        using (var ctx = new TrainingContext())
        {
            ClassRoom classRoomEntity = ctx.
                                        ClassRooms.
                                        Include("Students").
                                        Single(c => c.ClassID == classRoomDto.ClassId);
            classRoomEntity.ClassName = classRoomDto.ClassName;
            classRoomEntity.Students.Clear();
    
            foreach (var studentDto in classRoomDto.Students)
            {
                Student student;
                if (studentDto.StudentId == 0)
                {
                    // it's a new student add it to the classroom
                    student = new Student
                                  {
                                      StudentID = studentDto.StudentId,
                                      StudentName = studentDto.StudentName
                                  };
                }
                else
                {
                    student = ctx.
                              Students.
                              SingleOrDefault(s => s.StudentID == studentDto.StudentId)
    
                    // Update name
                    student.StudentName = studentDto.StudentName;
                }
    
                classRoomEntity.Students.Add(student);
            }
    
            ctx.SaveChanges();
        }
    }
    

    这可能是您正在寻找的方法。我专门编写了第一个代码片段,向您展示如何处理新实体和现有实体的不同情况,但它是第二个(更简单)更正确的方法。希望这有帮助。

    太棒了。非常感谢你的帮助!!我正在努力学习EF,我正在做一个真实的项目,你的帮助非常巨大。谢谢。
       ClassID-ClassName