实体框架儿童集合

时间:2014-06-04 17:42:58

标签: c# sql entity-framework

我有一张名为“公证人”的表:

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();

它有效。我明白,这是一件微不足道的事情,但不明白如何解决它

3 个答案:

答案 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