例如,请使用以下数据库表:学生,课程和学生课程。
我如何在实体框架中确保为学生添加新课程时该课程尚不存在?这对我来说意味着,检查StudentCourses表。
我是否需要编写直接sql来检查它?
答案 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);
但是,其他答案中建议的方法并不能阻止