实体框架不希望删除具有多对多关系的表中的行

时间:2013-12-17 17:45:53

标签: c# sql database entity-framework

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

表格是:

组织

  • Id(int Primary Key)
  • 姓名(字符串)

OrganizationContact(多对多)

  • Id(int Primary Key)
  • OrganizationId(Organization.Id不可为空的外键)
  • ContactTypeId(ContactType的外键.Id不可为空)
  • 详情(字符串)

ContactType

  • Id(int Primary Key)
  • 名称(字符串可为空)

这是代码:

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'类型的异常,但未在用户代码中处理

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

我会对任何建议表示感谢。谢谢!

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

1 个答案:

答案 0 :(得分:4)

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关系。