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