Проблема сохранения клонированной сущности EF в БД - PullRequest
3 голосов
/ 26 февраля 2011

Мне удалось успешно клонировать объект EF, используя сериализацию и десериализацию. Если я установлю EntityKey на ничего, я могу добавить его в контекст. Но когда я пытаюсь сохранить SaveChanges, я получаю сообщение о том, что первичный ключ должен быть уникальным. Это имеет смысл, поскольку у клона тот же ключ. Поэтому мне нужно изменить это заранее.

Но первичный ключ автоматически присваивается БД (SQLite) при вставке, и, поскольку PK не обнуляется, я не могу установить NewEntity.ID = Nothing, что, как я предполагаю, сообщит контексту, что эта сущность должна получить временный ключ, пока вставлено.

Если я установлю NewEntity.ID = 30804328 или какое-то произвольное (неиспользованное) число, оно будет хорошо сохранено в БД. Но я совершенно не склонен запрашивать неиспользуемое значение идентификатора каждый раз, когда хочу клонировать сущность.

Я понял, что контекст будет обрабатывать отдельную сущность как новую, когда она была добавлена ​​в AddObject, и назначать ей временный ключ, чтобы БД могла выполнять присваивание, а затем контекст получал обновления. Разве это не так?

Как мне решить это? Спасибо за любой совет!

Ответы [ 2 ]

3 голосов
/ 26 февраля 2011

Это также рассматривается здесь: Клонирование данных в Entity Framework

Если похоже, что следующий код - это путь:

  context.Detach(entity);      
  entityCollection.Add(entity);
  context.SaveChanges(); // New id will be assigned here
1 голос
/ 25 августа 2011

Я НАШЕЛ РЕШЕНИЕ НАКОНЕЦ. Проблема заключалась в том, что соответствующая таблица имела первичный ключ, но автоинкремент не был установлен. Похоже, что хотя идентификатор ключа по умолчанию равен нулю при создании нового объекта и не может быть изменен при назначении, он автоматически назначается в случае, если установлен автоинкремент. Но ясно, что это не может быть решено автоматически, если автоинкремент (или вычисленный) не установлен.

...