更新实体框架中的关系会生成 SQL 错误

本文关键字:SQL 错误 关系 实体 框架 更新 | 更新日期: 2023-09-27 18:36:09

我在这里头疼。我在会话和用户对象之间有一个一对一的关系,在实体框架 4 中使用模型优先方法设计。

  • 用户具有会话(一个
  • 会话可以有一个用户(从零到一)。

因此,在运行时,我使用

Session session = context.Sessions.FirstOrDefault(s => s.Token.Equals(token));

之后,我创建了一个用户,基于这样的用户输入创建

user = context.Users.Create();
user.GUID = Guid.NewGuid();
user.Username = username;
user.Firstname = firstname;
user.Lastname = lastname;
user.Session = session;
context.Users.Add(user);
context.SaveChanges();

当我保存时,SQL 服务器会抛出一个异常,告诉我我尝试插入数据库的 GUID 已经存在,因为是的,它确实存在。问题是,它不应该插入,它应该更新会话并填写属于它的 forein 键。外键驻留在关系的用户端,这没问题,对吧?

编辑用户应该是新用户。更新用户不是我要完成的。此外,该错误是因为代码尝试插入具有相同主键值的会话,而不仅仅是更新其前置键。

以下是按时间顺序排列的应执行操作列表:

  • 会话已创建
  • 会话已保存
  • 从数据库中选择会话
  • 用户被创建
  • 设置用户<>会话关系
  • 用户被保存

我得到的是:

违反主键约束"PK_Sessions"。无法在对象 'dbo 中插入重复键。会话"。重复的键值为 VALUE。该语句已终止。

请帮助我,在过去的 2 个小时里我一直在摆弄这个。

更新实体框架中的关系会生成 SQL 错误

编辑:更改了我的答案以反映更改的问题描述:)

确保在处理此类更新时始终使用相同的上下文实例。

这里似乎发生的事情是,会话在一个上下文中检索,但用户保存在该上下文的另一个实例中。因此,在新的背景下,会议被视为新的,因此,它被(错误地)引入。