在我的应用程序中更新实体(用户)时遇到问题。
当用户已登录时,实体位于会话中。所以我做到了:
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中找到。 验证密钥的值 提供的对象匹配键值 必须进行更改的对象 应用
答案 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