实体框架子集合
本文关键字:子集合 框架 实体 | 更新日期: 2023-09-27 18:06:57
我有一个名为"公证人"的表:
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?
,它不能做那个赋值,它会抛出你看到的错误。
你说你正在尝试删除对象,所以你需要从数据库中删除它们。要做到这一点,你可以按照我上面解释的做。
如果有语法错误,请原谅这个例子,我目前在VB中工作,但方法是相同的
foreach (NotaryPhones np in notary.NotaryPhones)
{
db.NotaryPhones.DeleteObject(np);
}
然后用
保存更改db.SaveChanges ();
Clear
只是从相关集合中删除实体。它不会从数据库中删除实体。您必须从相应的DbSet
中删除每个NotaryPhone
。