实体框架;我不想删除表中具有多对多关系的行

本文关键字:关系 框架 我不想 删除 实体 | 更新日期: 2024-10-19 00:03:04

就像标题说EF 6不想删除表中的行(多对多关系)。

表格为:

组织

  • Id(int主键)
  • 名称(字符串)

组织联系(多对多)

  • Id(int主键)
  • OrganizationId(Organization.Id的外键不可为null)
  • ContactTypeId(ContactType.Id的外键不可为null)
  • 详细信息(字符串)

接触式

  • Id(int主键)
  • 名称(字符串可以为null)

这是代码:

using (var db = new Entities())
{
   db.Database.Log = x => Debug.WriteLine(x);
   var organizationDto = db.Organizations.First();
   var contactDto = organizationDto.Contacts.Last();
   organizationDto.Contacts.Remove(contactDto);
   db.SaveChanges();
}

这是一个例外:

EntityFramework.dll中发生类型为"System.InvalidOperationException"的异常,但未在用户代码中处理

其他信息:操作失败:由于一个或多个外键属性不可为null,因此无法更改关系。当对关系进行更改时,相关的外键属性将设置为null值。如果外键不支持null值,则必须定义新的关系,必须为外键属性分配另一个非null值,或者必须删除不相关的对象。

如有任何建议,我将不胜感激。谢谢

编辑:数据库的日志。SaveChanges()显示没有对数据库的查询。

实体框架;我不想删除表中具有多对多关系的行

using (var db = new FIXEntities())
{
   db.Database.Log = x => Debug.WriteLine(x);
   var organizationDto = db.Organizations.First();
   var contactDto = organizationDto.Contacts.Last();
   //organizationDto.Contacts.Remove(contactDto); // not necessary
   db.Entry(contactDto).State = EntityState.Deleted;
   // or, like this if you prefer
   db.Set<OrganizationContact>().Remove(contactDto);
   db.SaveChanges();
}

仅仅从集合属性中删除它是不够的,你必须删除它。由于多对多有自己的主键,EF不知道你想删除它,它只是认为你想解除它的关联。因此,为了满足EF在异常中抱怨的FK关系,您必须将其删除。