如何通过实体框架检查多个表到多个表的重复项

时间:2013-11-20 14:25:08

标签: c# entity-framework

例如,请使用以下数据库表:学生,课程和学生课程。

我如何在实体框架中确保为学生添加新课程时该课程尚不存在?这对我来说意味着,检查StudentCourses表。

我是否需要编写直接sql来检查它?

4 个答案:

答案 0 :(得分:2)

using (var context = new StudentContext()
{
 var alreadyExists = context.StudentsCourses.Any(x => x.StudentId == studentId && x.CourseId == courseId);
}

答案 1 :(得分:0)

创建方法:

public bool IsStudentOnCourse(int studentId, int courseId)
{
    using (var db = new DBContext()) //replace for real context..
    {
        return db.StudentsCourses.Any(x => x.StudentId == studentId && x.CourseId == courseId);
    }
}

答案 2 :(得分:0)

本杰明保罗的回答非常有效。另一个选择是尝试检索您的学生,如果不存在,请创建一个新学生。

你可以创建一个这样的方法

public StudentCourse CreateOrUpdate(VM_StudentCourse studentCourse)
{
    StudentCourse dbStudentCourse;
    using (var context = new StudentContext()
    {
        dbStudentCourse = context.StudentsCourses.FirstOrDefault(x => x.StudentId == studentCourse.studentId && x.CourseId == studentCourse.courseId);
        If (dbStudentCourse == null)
        {
           dbStudent = new StudentCourse();
           dbStudent.StudentId = studentCourse.StudentId;
           dbStudent.CourseId = studentCourse.CourseId;
           context.Add(dbStudent);
        }
        dbStudent.OtherProperty1 = studentCourse.SomeProp;
        dbStudent.OtherProperty2 = studentCourse.SomeOtherProp;

        context.SaveChanges();
    }
    return dbStudentCourse;
}

答案 3 :(得分:0)

如果您有多对多的简单关系,则可能没有StudentsCourse实体。我喜欢这种模式,以增加多对多的关系:

public Student
{
   private _Courses = new List<Course>();

   public int ID { get; set; }

   public virtual ICollection Courses 
   {
      get { return _Courses; }
      protected set { _Courses = value; }
   }

   public void AddCourse(Course course)
   {
      //And you can add your duplicate check here
      if(!Courses.Any(c => c.ID == course.ID))
         Courses.Add(course);
   }
}

不幸的是,Courses属性不是只读集合,因此它不会阻止某人绕过该方法:

student.Courses.Add(course);

但是,其他答案中建议的方法并不能阻止