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

C# 实体框架不';我不想删除具有多对多关系的表中的行,c#,sql,database,entity-framework,C#,Sql,Database,Entity Framework,正如标题所说,EF6不想删除表中的行(多对多关系) 表格如下: 组织机构 Id(int主键) 名称(字符串) 组织联系人(多对多) Id(int主键) OrganizationId(Organization.Id的外键不可为空) ContactTypeId(ContactType.Id的外键不可为空) 详细信息(字符串) 接触式 Id(int主键) 名称(字符串可为空) 代码如下: using (var db = new Entities()) { db.Database.Lo

正如标题所说,EF6不想删除表中的行(多对多关系)

表格如下:

组织机构

  • Id(int主键)
  • 名称(字符串)
组织联系人(多对多)

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

  • Id(int主键)
  • 名称(字符串可为空)
代码如下:

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。对关系进行更改时,相关外键属性设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象

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

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

使用(var db=new FIXEntities())
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();
}
{ db.Database.Log=x=>Debug.WriteLine(x); var organizationDto=db.Organizations.First(); var contactDto=organizationDto.Contacts.Last(); //organizationDto.Contacts.Remove(contactDto);//不需要 db.Entry(contactDto).State=EntityState.Deleted; //或者,如果你愿意的话,像这样 db.Set().Remove(contactDto); db.SaveChanges(); }
仅将其从集合属性中删除是不够的,必须将其删除。由于您的多对多有自己的主键,EF不知道您希望删除它,它只是认为您希望它解除关联。因此,您必须删除它,以满足EF在异常中抱怨的FK关系。

使用(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);//不需要
db.Entry(contactDto).State=EntityState.Deleted;
//或者,如果你愿意的话,像这样
db.Set().Remove(contactDto);
db.SaveChanges();
}

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

当您删除
联系人时,是否希望删除级联?删除一个
联系人
可能会留下一个
OrganizationContact
行,该行指向
联系人
中不存在的行。实际上,我正在尝试删除OrganizationContact行,我只想删除OrganizationContact中的行,不想再删除任何内容。当您删除
联系人
时,是否要级联删除?删除一个
联系人
可能会留下一个
OrganizationContact
行,该行指向
联系人
中不存在的行。实际上,我正在尝试删除OrganizationContact行,我只想删除OrganizationContact中的行。