由于一个或多个外键属性是非空的,所以无法更改关系。

217
我在对实体进行GetById()操作后,将子实体的集合设置为来自MVC视图的新列表时,遇到了这个错误。

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

我不太理解这一行:

由于一个或多个外键属性是非空的,所以无法更改关系。

为什么我要更改两个实体之间的关系?它应该在整个应用程序的生命周期内保持不变。

异常发生的代码很简单,只是将修改后的子类分配给现有父类的集合。这样做可以处理删除子类、添加新子类和修改子类的情况。我本以为Entity Framework会处理这个问题。

这些代码可以简化为:

var thisParent = _repo.GetById(1);
thisParent.ChildItems = modifiedParent.ChildItems();
_repo.Save();

我在下面的文章中使用了解决方案#2找到了答案,基本上是为了引用父表而在子表中创建了一个主键(因此它有2个主键(父表的外键和子表的ID)。https://www.c-sharpcorner.com/UploadFile/ff2f08/entity-framework-error-the-relationship-could-not-be-chang/ - yougotiger
@jaffa,我在这里找到了答案:https://stackoverflow.com/questions/22858491/entity-framework-remove-object-with-foreign-key-preserving-parent。 - antonio
1
对我来说,解决方法很简单。我的数据库外键列是可空整数,但我的 EF 属性是整数。我将其更改为 int? 以匹配数据库,问题得到解决。 - redwards510
21个回答

-1

我以前遇到过这个问题,尝试了一切,但在我的情况下解决方案与上面列出的不同。

如果您使用已从数据库检索的实体并尝试修改其子项,将会出现错误,但是如果您从数据库获取新副本,则不应出现任何问题。 不要使用这个:

 public void CheckUsersCount(CompanyProduct companyProduct) 
 {
     companyProduct.Name = "Test";
 }

使用这个:
 public void CheckUsersCount(Guid companyProductId)
 {
      CompanyProduct companyProduct = CompanyProductManager.Get(companyProductId);
      companyProduct.Name = "Test";
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接