从具有多对多关系的实体中删除对象

本文关键字:实体 删除 对象 关系 | 更新日期: 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();

提前感谢!

从具有多对多关系的实体中删除对象

您只需要通过清除特定TimetableDetailTeachers列表来清除关联表。使用你的代码…

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);