Entity framework EF6代码首先无法更新对象上的外键-引用完整性约束

Entity framework EF6代码首先无法更新对象上的外键-引用完整性约束,entity-framework,ef-code-first,Entity Framework,Ef Code First,我在人与地之间有一对一的关系。如果我尝试更改PlaceId,或为Place属性指定一个新位置,则会出现错误。您应该如何更改相关实体 以下操作失败:发生引用完整性约束冲突:定义引用约束的属性值在关系中的主体对象和从属对象之间不一致 person.Place.PlaceId = placeId; _db.Entry(person.Place).State = EntityState.Modified; _db.Entry(person).State = EntityState.Modified; _

我在人与地之间有一对一的关系。如果我尝试更改PlaceId,或为Place属性指定一个新位置,则会出现错误。您应该如何更改相关实体

以下操作失败:发生引用完整性约束冲突:定义引用约束的属性值在关系中的主体对象和从属对象之间不一致

person.Place.PlaceId = placeId;
_db.Entry(person.Place).State = EntityState.Modified;
_db.Entry(person).State = EntityState.Modified;
_db.SaveChanges();
如果我尝试用下面的更新,我会得到同样的错误。我应该只使用存储过程来处理类似的事情吗?我花了几分钟创建了一个存储过程来进行更新,但却花了几个小时搞乱了实体框架,我仍然无法让它工作

person.Place = Place; //where Place is a valid object

这是一种1:1的关系

public class Person
{
  public int PlaceId {get; set;}
  [ForeignKey("PlaceId")]
  public Place Place {get; set;}
}
我最终通过将属性设置为null,然后再将FK属性设置为null来实现它。此外,如果在设置FK值之前将EntityState设置为modified,则会出现相同的错误,因此必须按此确切顺序执行。我不喜欢它,因为它不直观,而且我找不到任何关于如何做到这一点的文档

 _db.People.Attach(person);
 _db.Entry(person).State = EntityState.Modified;
person.Place = null;
person.PlaceId = placeId;

“花了我几个小时”的评论只是因为你不知道怎么做。不是因为EF有什么问题。如果您不知道如何在SQL中实现这一点,那么您可能也需要几个小时才能弄清楚。无论如何,很难回答您的问题,因为您没有确切说明如何定义实体。根据不同的定义,实现的方法会有所不同。当你说是1:1时,你确定吗?EF只支持使用共享主键的1:1关系,这里的情况似乎不是这样。更有可能的是,您实际上有一个多:1,您只将一个项链接到该关系。顺便说一下,当你说“我试过xxx,但没用”时,“没用”是含糊不清的,没有告诉我们任何事情。。。你做xxx的时候发生了什么?你有错误吗?它什么也没做吗?它唱国歌了吗?我想你误读了其中的一部分,我提到“如果我尝试用下面的内容更新,我会得到同样的错误。”下面是“person.Place=Place