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

时间:2014-05-30 14:05:30

标签: c# entity-framework entity

我是Entity Framework的新手,所以我需要帮助从实体中删除一个对象。 我有两个表在多对多关系中的表和一个在数据库中连接它们的关联表。在模型中只有两个表,关联一个由导航属性表示,因为这是EF的工作方式。现在我需要通过context.EntityName.DeleteObject(object)从第一个表中删除一个对象,但是当我尝试这样做时,代码失败并显示错误“DELETE语句与REFERENCE约束FK ...冲突”,这是来自的一个外键。关联表到实体,我尝试删除哪个对象。我想知道如何解决这个问题。你能帮我吗?

以下是表格的样子:

教师

  • Teacher_ID
  • 名字

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

提前致谢!

3 个答案:

答案 0 :(得分:5)

您只需清除特定Teachers的{​​{1}}列表即可清除关联表。使用你的代码...

TimetableDetail

关键是TimetablesEntities context = new TimetablesEntities(); TimetableDetail detail = context.TimetableDetails.SingleOrDefault(td => td.TimetableDetail_ID == timetableDetailId); detail.Teachers.Clear(); context.TimetableDetails.DeleteObject(detail); context.SaveChanges();

答案 1 :(得分:0)

是的,这是一个棘手的问题。

您需要做的是清除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作为存储库类中的成员变量。我只是想指出它,以防它不清楚。

答案 2 :(得分:0)

你可以这样做: 在删除详细信息之前添加行:

context.Teachers.RemoveRange(detail.Teachers);

关键在于...