Когда 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, я искал на Интернет и видел класс EntityKey в MSDN, но до сих пор не могу понять, ясно. Когда EntityKey создан и прикреплен к объекту? Где я могу найти его? Если я отсоединяю объект, почему EntityKey все еще существует?
Кто-нибудь может помочь? Заранее спасибо!
2 ответа
EntityKey
это объект, который используется Entity Framework для уникальной идентификации вашего объекта и отслеживания его.
Когда вы создаете новый объект, ключевые свойства вашей сущности null
(или же 0
). ObjectContext
не знает, что ваша сущность существует, и еще не отслеживает ее, поэтому нет ключа сущности.
Когда вы добавляете объект в контекст, создается временный ключ. После этого вы можете сохранить изменения в вашей базе данных. Это сгенерирует оператор вставки и извлечет новый ключ из базы данных, построит постоянный 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
Думайте о классе EntityKey как об уникальном идентификаторе сущности. Контекст использует его для различных операций, таких как отслеживание изменений, параметры слияния и т. Д. Если вы не хотите указывать ключ объекта для нового объекта, используйте context.AttachTo("Пользователи", пользователь) и контекст сгенерируют для вас объектный ключ.