1

我在这里头疼。我在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已经存在,因为是的,它确实存在。问题是,它不应该插入,它应该更新会话并填充属于它的外键。 外键位于关系的用户端,这没关系,对吧?

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

以下是按时间顺序排列的应做事项列表:

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

我得到的是:

违反 PRIMARY KEY 约束“PK_Sessions”。无法在对象“dbo.Sessions”中插入重复键。重复键值为VALUE。该语句已终止。

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

4

1 回答 1

1

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

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

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

于 2013-10-21T11:35:29.403 回答