当EntityKey创建时它被处理掉

时间:2011-12-16 07:52:32

标签: entity-framework detach entitykey

我创建了一个新对象,并希望将其附加到这样的上下文,

User user = new User();
user.userName=”Kobe”;
context.Attach(user);

出现错误消息 - “具有空EntityKey值的对象无法附加到对象上下文”。 如果我从数据库中查询用户对象并将其EntityKey分配给新对象,则分离查询结果对象,如下所示,

User user = (from u in context.Users where u.userID == 1 select u).First();
User newUser = new User();
newUser.userName = “Kobe”;
newUser.EntityKey = user.EntityKey;
context.Detach(user);
context.Attach(newUser);

出现另一条错误消息 - “无法附加对象,因为作为EntityKey一部分的属性的值与EntityKey中的对应值不匹配。” 我真的不知道EntityKey是什么,我在互联网上搜索并在MSDN中看过EntityKey类,但仍然无法理解。当EntityKey创建并附加到对象?哪里可以找到它?如果我分离对象,为什么EntityKey仍然存在?

任何人都可以提供帮助?提前谢谢!

2 个答案:

答案 0 :(得分:3)

EntityKey是一个对象,实体框架使用它来唯一地标识您的对象并跟踪它。

构建新对象时,实体的关键属性为null(或0)。 ObjectContext不知道您是实体存在且尚未跟踪它,因此没有实体密钥。

将对象添加到上下文时,会构造一个临时键。 之后,您可以将更改保存到数据库中。这将生成一个Insert语句并从数据库中检索新密钥,构造永久EntityKey并更新它对临时密钥的所有引用。

附加是另一个故事。当对象已存在于数据库中但没有与ObjectContext的连接时,将实体附加到ObjectContext。

因此,在您的情况下,您应该更改用于添加新实体的代码:

User user = new User();
user.userName=”Kobe”;

context.Users.Add(user); // Generate a temporary EntityKey
// Insert other objects or make changes
context.SaveChanges(); // Generate an insert statement and update the EntityKey

答案 1 :(得分:0)

将EntityKey类视为实体的唯一标识符。 Context将其用于各种操作,如更改跟踪,合并选项等。如果您不想为新对象指定实体键,请使用context.AttachTo(“Users”,user)和context将为您生成实体键。