我有一个名为“ Notaries”的表:

NotaryID int,
NotaryName nvarchar(MAX)


和名为“ NotaryPhones”的表:

PhoneID int,
NotaryID int,
PhoneNumber nvarchar(50)


因此,关系“一对多”。现在,我想根据公证人清除所有电话。我的代码:

            Notary.Models.Notary notary = (from i in db.Notaries where i.NotaryID == model.NotaryID.Value select i).FirstOrDefault();
            notary.CityID = Convert.ToInt32(model.City.SelectedItem);
            notary.NotaryPhones.Clear();
            db.SaveChanges();


但我得到一个错误:


  操作失败:无法更改关系,因为
  一个或多个外键属性不可为空。当一个
  更改关系后,相关外键属性为
  设置为空值。如果外键不支持空值,
  必须定义新的关系,外键属性必须为
  分配另一个非空值,否则不相关的对象必须是
  已删除。


如果我删除字符串

notary.NotaryPhones.Clear();


有用。我了解这是一件微不足道的事情,但不了解如何解决

最佳答案

这是因为您的notary.NotaryPhones.Clear();正在将外键引用从您的NotaryPhone表删除到您的Notary表。因为这被设置为不可为空的键,所以您没有孤立的电话记录,所以您会收到该错误。

相反,您要做的是在存储库中设置一个方法,该方法将调用context.NotaryPhones.Remove(**instance variable pointing to one of the phones to delete**);并将其从数据库中删除。

澄清说明

它删除外键引用的原因是notary.NotaryPhones.Clear()只是从notary对象中删除了那些对象。这些对象将按照您编写本文的方式继续存在。

因此,当执行.Clear()时,它将使用您的phone.NotaryID属性并摆脱指向notary的ID指针。由于未分配其他任何内容,因此它尝试分配的值是null(唯一不可能指向Notary对象的值)。但是,因为您将其设置为int,而不是int?,所以它无法进行该分配,并且会引发您看到的错误。

您说过要删除对象,因此需要从数据库中删除它们。为此,请按照我上面的解释进行操作。

10-04 15:02