更新Entity Framework中的关系会生成SQL错误

时间:2013-10-21 11:28:39

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

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

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

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

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

我得到的是:

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

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

1 个答案:

答案 0 :(得分:1)

编辑:更改了我的答案以反映更改后的问题说明:)

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

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