Когда EntityKey создать и когда он расположен - PullRequest
0 голосов
/ 16 декабря 2011

Я создаю новый объект и хочу присоединить его к контексту, подобному этому,

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, я искал в Интернете и видел класс EntityKey в MSDN, но все еще могу 'Я не понимаю, ясно.Когда EntityKey создан и прикреплен к объекту?Где я могу найти его?Если я отсоединяю объект, почему EntityKey все еще существует?

Кто-нибудь может помочь?Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 16 декабря 2011

EntityKey - это объект, который используется Entity Framework для уникальной идентификации вашего объекта и отслеживания его.

Когда вы создаете новый объект, ключевыми свойствами вашей сущности являются 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
0 голосов
/ 16 декабря 2011

Думайте о классе EntityKey как об уникальном идентификаторе сущности.Контекст использует его для различных операций, таких как отслеживание изменений, параметры слияния и т. Д. Если вы не хотите указывать ключ объекта для нового объекта, используйте context.AttachTo («Пользователи», пользователь) и контекст генерируют для вас объектный ключ.

...