Недавно я начал использовать Entity Framework, и было больно проверить, действительно ли мне нужно добавлять новые записи в базу данных или нет.
Если объект, который мне нужно добавить в базу данных, уже на нем, я буду знать, потому что я делаю запрос перед его вставкой, и если он существует, то я сохраняю этот экземпляр, потому что мне нужно использовать его в некоторых отношениях.
Предположим, что мое имя объекта Book
.
Проблема возникает, когда объект не находится в базе данных, и я делаю:
Book b = //...
modelContainer.AddToBooks(b);
Я мог бы легко сделать:
modelContainer.SaveChanges()
каждый раз, когда я добавляю новый объект (независимо от того, какой он объект), и это будет работать нормально, потому что, когда я вставляю один вид записи одновременно и проверяя, уже ли он в базе данных, я выиграл У меня проблемы с дублированием.
Но что, если я хочу так часто не звонить SaveChanges()
?
В этом вопросе: Можно ли проверить, прикреплен ли объект к контексту данных в Entity Framework?, автор вопроса предоставляет метод, который мне помогает в моем случае, но это не работает, если я Add
объект в контексте вместо Attaching
его.
Мой вопрос (возможно, два, но очень связанные): в чем разница между Add и Attach и как я могу решить свою проблему?
Edit:
Вот пример проблемы, с которой я столкнулся.
У меня есть сущность Result
, которая имеет отношение с двумя другими объектами: Trainer
и Horse
.
Я получаю данные от внешнего источника, поэтому мне нужно вручную создать все объекты.
Каждый раз, когда мне нужно вставить новый Trainer
, я:
var trainer = Trainer.CreateTrainer(Id)
Затем я запрашиваю базу данных, чтобы узнать, есть ли в этой базе тренера с этим Id
. Если это так, я заменяю переменную Trainer
той, что находится в базе данных.
Если это не так, я могу сделать здесь две вещи:
- Прикрепите тренера к контексту (я могу проверить, существует ли он с помощью ключа)
- Добавьте тренера в контекст (используя
AddToTrainers(...)
)
Тот же процесс для Horse
.
Теперь, когда мне нужно создать новый Result
(содержащий Trainer
и Horse
), я назначил предыдущий тренер и лошадь этому экземпляру результата.
Что мне делать, чтобы добавить в контекст новый Result
?
- Если я присоединяю тренера/лошади, тогда, когда я присоединяю результат, я получаю
InvalidOperationException
, сообщая мне, что тренер уже находится в контексте объекта. - Если я добавлю тренера вместо его присоединения, я получаю еще одну ошибку (не могу вспомнить ее прямо сейчас, но она говорила мне, что трейнер уже был в базе данных).
Важно:
Первая ошибка указана при прикреплении результата, а вторая при выполнении SaveChanges()
.
То, что я хочу избежать здесь, вызывает SaveChanges()
каждый раз, когда я добавляю новый результат.