Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从具有多对多关系的实体中删除对象_C#_Entity Framework_Entity - Fatal编程技术网

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

C# 从具有多对多关系的实体中删除对象,c#,entity-framework,entity,C#,Entity Framework,Entity,我是实体框架的新手,所以我需要从实体中删除对象的帮助。 我有两个多对多关系的表和一个关联表,在数据库中连接它们。在模型中只有两个表,其中一个表由导航属性表示,因为EF就是这样工作的。现在我需要通过context.EntityName.DeleteObject(object)从第一个表中删除一个对象,但当我尝试删除时,代码失败,错误为“delete语句与引用约束FK..冲突”,这是从关联表到实体的外键,我尝试删除该实体。我想知道如何解决这个问题。你能帮帮我吗 以下是表格的外观: 教师 教师ID

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

以下是表格的外观:

教师
  • 教师ID
  • 名字
  • 姓氏
时间表详情
  • TimetableDetail\u ID
  • 教育纪律
  • 平日
  • 开始时间
  • 持续时间
和关联表:

教师时间表
  • 教师ID
  • TimetableDetail\u ID
下面是我尝试删除它的方式:

TimetablesEntities context = new TimetablesEntities();

TimetableDetail detail = context.TimetableDetails.SingleOrDefault(td => td.TimetableDetail_ID == timetableDetailId);

context.TimetableDetails.DeleteObject(detail);

context.SaveChanges();

提前谢谢

是的,这是个棘手的问题

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

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

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

您只需要通过清除特定
时间表详细信息的
教师列表来清除关联表。使用你的代码

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

您只需清除特定
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()
您可以执行以下操作: 在删除详细信息之前添加行:

context.Teachers.RemoveRange(detail.Teachers);
关键是……

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

context.Teachers.RemoveRange(detail.Teachers);

关键的一点是……

您的中间表通常被称为关联表,这一点很清楚。你能发布表结构和几行C#来显示你想如何删除对象吗?你的中间表通常被称为关联表,只是为了清楚一点。你能发布表格结构和几行C#来显示你想如何删除对象吗?谢谢!这非常有帮助,但是您知道如何使用ObjectContext来实现吗@Lászlókoller谢谢!这非常有帮助,但是您知道如何使用ObjectContext来实现吗@拉斯洛科勒