首页 文章

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

提问于
浏览
0

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

表是:

组织

  • Id(int主键)

  • 姓名(字符串)

OrganizationContact(多对多)

  • Id(int主键)

  • OrganizationId(Organization.Id的外键不可为空)

  • ContactTypeId(ContactType.Id的外键不可为空)

  • 详细信息(String)

ContactType

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

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

我会很感激任何建议 . 谢谢!

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

1 回答

  • 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关系 .

相关问题