首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架子集合

实体框架子集合
EN

Stack Overflow用户
提问于 2014-06-04 17:42:57
回答 3查看 193关注 0票数 1

我有一张桌子叫“公证人”:

代码语言:javascript
复制
NotaryID int,
NotaryName nvarchar(MAX)

以及名为“NotaryPhones”的表:

代码语言:javascript
复制
PhoneID int,
NotaryID int,
PhoneNumber nvarchar(50)

所以,关系“一对多”。现在我想通过所有的电话,取决于公证人。我的代码:

代码语言:javascript
复制
            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();

但我发现了一个错误:

操作失败:由于一个或多个外键属性不可空,关系无法更改。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

如果我移除字符串

代码语言:javascript
复制
notary.NotaryPhones.Clear();

它起作用了。我明白,这是件小事,但我不知道如何解决

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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?,所以它不能进行分配,它会抛出您看到的错误。

您说要删除对象,所以需要从数据库中删除它们。要做到这一点,你要做我前面解释过的。

票数 3
EN

Stack Overflow用户

发布于 2014-06-04 17:52:30

如果有语法错误,请原谅,我目前使用的是VB,但是方法是相同的。

代码语言:javascript
复制
foreach (NotaryPhones np in notary.NotaryPhones)
{
      db.NotaryPhones.DeleteObject(np);
}

然后用以下方法保存更改

db.SaveChanges();

票数 2
EN

Stack Overflow用户

发布于 2014-06-04 17:53:10

Clear只是从相关集合中删除实体。它不会从数据库中删除实体。您必须从相应的NotaryPhone中删除每个DbSet

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24044079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档