我有一张桌子叫“公证人”:
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();它起作用了。我明白,这是件小事,但我不知道如何解决
发布于 2014-06-04 17:48:21
您的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?,所以它不能进行分配,它会抛出您看到的错误。
您说要删除对象,所以需要从数据库中删除它们。要做到这一点,你要做我前面解释过的。
发布于 2014-06-04 17:52:30
如果有语法错误,请原谅,我目前使用的是VB,但是方法是相同的。
foreach (NotaryPhones np in notary.NotaryPhones)
{
db.NotaryPhones.DeleteObject(np);
}然后用以下方法保存更改
db.SaveChanges();
发布于 2014-06-04 17:53:10
Clear只是从相关集合中删除实体。它不会从数据库中删除实体。您必须从相应的NotaryPhone中删除每个DbSet。
https://stackoverflow.com/questions/24044079
复制相似问题