更新实体时出现问题

时间:2011-06-21 19:39:13

标签: vb.net entity-framework

在我的应用程序中更新实体(用户)时遇到问题。

当用户已登录时,实体位于会话中。所以我做到了:

Dim u as User = (From x in ctx.Users).First()
Session("user") = u

好的,还没有问题。

但是当我需要更改用户时:

Dim u as User = Ctype(Session("User"),User)
u.name = "new name"
ctx.Users.ApplyCurrentValues(u)

我收到了以下错误:

  

具有与之匹配的键的对象   提供的对象的键不能   可以在ObjectStateManager中找到。   验证密钥的值   提供的对象匹配键值   必须进行更改的对象   应用

2 个答案:

答案 0 :(得分:0)

你可能想试试这个:

ctx.Users.Attach(User);
ctx.ObjectStateManager.ChangeObjectState(User, EntityState.Modified);
ctx.SaveChanges();

这是我在EF

中更新现有实体时使用的样式

- 迈克尔

答案 1 :(得分:0)

在执行此操作之前,第一个示例无效:

Dim u as User = Ctype(Session("User"),User)
u.name = "new name"
(From x in ctx.Users).First()
ctx.Users.ApplyCurrentValues(u)
ctx.SaveChanges

ApplyCurrentValues仅从传递的对象中获取值,并将它们复制到必须加载并附加到上下文的相同对象类型。

@Mlantosca显示的第二个示例无法工作,因为您在会话中存储实体而您没有将其分离。要使其工作,您必须使用:

Dim u as User = (From x in ctx.Users).First()
ctx.Detach(u)
Session("user") = u