我有一个名为“ 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?
,所以它无法进行该分配,并且会引发您看到的错误。
您说过要删除对象,因此需要从数据库中删除它们。为此,请按照我上面的解释进行操作。