实体框架子集合

本文关键字:子集合 框架 实体 | 更新日期: 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