我有一张名为“公证人”的表:
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();
它有效。我明白,这是一件微不足道的事情,但不明白如何解决它
答案 0 :(得分:3)
正在进行的是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?
,所以它无法进行该分配,并且会引发您看到的错误。
您说您正在尝试删除对象,因此您需要将其从数据库中删除。要做到这一点,你做我上面解释的。
答案 1 :(得分:2)
请原谅示例,如果有语法错误,我目前在VB工作,但方法是相同的
foreach (NotaryPhones np in notary.NotaryPhones)
{
db.NotaryPhones.DeleteObject(np);
}
然后使用
保存更改db.SaveChanges();
答案 2 :(得分:2)
Clear
只是从相关集合中删除实体。它不会从数据库中删除实体。您必须从相应的NotaryPhone
中删除每个DbSet
。