在我的应用程序中,我有讲师,他们有他们可以教授的课程列表,当我删除一门课程时,我想要删除与讲师的连接。代码如下:
public void RemoveCourse(int courseId)
{
using (var db = new AcademicTimetableDbContext())
{
var courseFromDb = db.Courses.Find(courseId);
var toRemove = db.Lecturers
.Where(l => l.Courses.Contains(courseFromDb)).ToList();
foreach (var lecturer in toRemove)
{
lecturer.Courses.Remove(courseFromDb);
}
db.SaveChanges();
}
}
但它不起作用。我得到了
NotSupportedException:无法创建
Course
类型的常量值。在此上下文中仅支持基元类型或枚举类型。
我做错了什么?
发布于 2012-11-16 04:46:16
不能将Contains
与非原始值一起使用。做
Where(l => l.Courses.Select(c => c.CourseId).Contains(courseId)
(或您使用的Id字段)。
发布于 2013-07-05 00:52:08
如果您使用的是DbContext,则可以查询.Local集合,并且==运算符也将处理对象:
public void RemoveCourse(int courseId)
{
using (var db = new AcademicTimetableDbContext())
{
var courseFromDb = db.Courses.Find(courseId);
db.Lecturers.Load() //this is optional, it may take some time in the first load
//Add .Local to this line
var toRemove = db.Lecturers.Local
.Where(l => l.Courses.Contains(courseFromDb)).ToList();
foreach (var lecturer in toRemove)
{
lecturer.Courses.Remove(courseFromDb);
}
db.SaveChanges();
}
}
.Local是一个ObservableCollection,因此您可以在其中比较任何您喜欢的内容(不限于不支持对象比较的SQL查询)。为了确保获得.Local集合中的所有对象,您可以在调用.Local之前调用db.Lecturers.Load()方法,这会将所有数据库条目都放入Local集合中。
发布于 2017-11-03 14:11:28
下面行的Courses
集合应为null或空。
var toRemove = db.Lecturers
.Where(l => l.Courses.Contains(courseFromDb)).ToList();
https://stackoverflow.com/questions/13405568
复制相似问题