从具有多对多关系的实体中删除对象
本文关键字:实体 删除 对象 关系 | 更新日期: 2023-09-27 18:05:50
我是新的实体框架,所以我需要从实体中删除对象的帮助。我有两个表,这是在多对多的关系和一个关联表连接它们在数据库中。在模型中只有两个表,关联表由导航属性表示,EF就是这样工作的。现在我需要通过context.EntityName.DeleteObject(object)
从第一个表中删除一个对象,但是当我尝试这样做时,代码失败错误"delete语句与引用约束FK冲突……",这是一个从关联表到实体的外键,我试图删除哪个对象。我想知道如何解决这个问题。你能帮帮我吗?
表是这样的:
教师- Teacher_ID
- FirstName
- LastName
TimetableDetail
- TimetableDetail_ID
- EducationalDiscipline_ID
- 工作日
- 开始时间
和关联表:
TimetableDetailTeachers
- Teacher_ID
- TimetableDetail_ID
下面是我删除它的方法:
TimetablesEntities context = new TimetablesEntities();
TimetableDetail detail = context.TimetableDetails.SingleOrDefault(td => td.TimetableDetail_ID == timetableDetailId);
context.TimetableDetails.DeleteObject(detail);
context.SaveChanges();
提前感谢!
您只需要通过清除特定TimetableDetail
的Teachers
列表来清除关联表。使用你的代码…
TimetablesEntities context = new TimetablesEntities();
TimetableDetail detail = context.TimetableDetails.SingleOrDefault(td => td.TimetableDetail_ID == timetableDetailId);
detail.Teachers.Clear();
context.TimetableDetails.DeleteObject(detail);
context.SaveChanges();
关键行是detail.Teachers.Clear()
是的,这是一个棘手的问题。
您需要做的是将实体从EF的底层本地存储中清除。该示例展示了清除特定教师的所有详细信息(甚至只有一些详细信息)然后保存该教师的实体时的操作。考虑到这一点,下面是一些示例存储库代码:
public void EditTeacher(Teacher teacher)
{
if (teacher == null)
{
throw new ArgumentNullException("teacher");
}
YourDbContext.Entry(teacher).State = EntityState.Modified;
// Remove all timetable details that have an orphaned relationship.
// (E.g., orphaning occurs when 'teacher.TimetableDetails.Clear()'
// is called or when you delete one particular TimetableDetail
// entity for a teacher)
YourDbContext.TimetableDetails
.Local
.Where(td => td.Teacher == null)
.ToList()
.ForEach(td => YourDbContext.TimetableDetails.Remove(td));
YourDbContext.SaveChanges();
}
我希望这对你有帮助。
进一步阅读请参见:使用实体框架删除孤儿。
<子>编辑:子>
上面的示例代码假设您已经在代码的其他地方定义并创建了YourDbContext
作为存储库类中的成员变量。我只是想指出来以防大家不清楚
你可以这样做:在删除细节之前添加行:
context.Teachers.RemoveRange(detail.Teachers);