【问题标题】:Updating a relationship in Entity Framework generates SQL error在 Entity Framework 中更新关系会产生 SQL 错误
【发布时间】:2013-10-21 19:53:09
【问题描述】:

我在这里头疼。我在 Session 和 User 对象之间建立了 一对零或一 关系,这是在 Entity Framework 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 已经存在,因为是的,它确实存在。问题是,它不应该插入,它应该更新会话并填充属于它的外键。 外键位于关系的用户端,这没关系,对吧?

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

这里是按时间顺序排列的应该做的事情:

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

我得到的是:

违反主键约束“PK_Sessions”。无法在对象“dbo.Sessions”中插入重复键。重复键值为 VALUE。声明已终止。

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

【问题讨论】:

  • 我已经删除了我的答案,因为你的问题已经改变了

标签: c# sql sql-server entity-framework


【解决方案1】:

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

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

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

【讨论】:

  • 看到我的编辑,我突然意识到我的问题有点模糊。正是这种关系导致应用程序尝试插入重复会话,而不是插入新用户并更新会话
  • 好吧,确实更清楚了 :) 你提到那个 GUID 让我失望了 :)
  • 是的,我正在尝试将现有的 Session 与新用户结合起来并保存很多。
  • 它看起来确实很奇怪,因为我不希望在任何会话对象上插入(或更新)。至少在您显示的代码中,我找不到关于为什么应该创建、插入或更新任何会话的线索......
  • 确定在检索会话和插入用户时使用相同的上下文实例?我会假设是这样,但如果你不是,它可以解释为什么它将会话视为新会话......如果你尝试设置 user.Session = context.Sessions.FirstOrDefault(s => s.Token.Equals (代币));直接?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 2012-03-06
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 2019-07-18
相关资源
最近更新 更多