Отражать все изменения в ObjectContext без сохранения в базе данных
Так как ObjectContext.SaveChanges()
происходит в рамках транзакции. Я решил, что для моего приложения будет лучше сначала выполнить все запросы / обновления на ObjectContext
перед звонком SaveChanges()
один раз, чтобы записать данные в базу данных.
Однако это означает, что, если я создаю объект и последовательно запрашиваю ObjectContext
он отрицает его существование (предположительно, потому что база данных еще не обновлена). Я предполагал, что смогу обойти это с некоторыми SaveOptions, но это не похоже, что я могу.
Я в основном хочу ObjectContext
действовать как прокси, который я могу изменить, поскольку я хочу совершить все сразу. Есть ли способ, которым я могу достичь этого?
2 ответа
Если вы не сохраняете изменения, ваши новые объекты не существуют в базе данных, и никакой запрос к базе данных не выполняется (= нет запроса Linq to entity) их не вернет. Чтобы получить объекты, добавленные в контекст, но еще не сохраненные, необходимо выполнить запрос ObjectStateManager
:
var data = context.ObjectStateManager
.GetObjectStateEntries(EntityState.Added)
.Where(e => !e.IsRelationship)
.Select(e => e.Entity)
.OfType<YourEntityType>();
Я должен был сделать что-то подобное в подобной ситуации:
Приведен список ключей и значений, где некоторые ключи являются новыми, и требуется обновить / вставить ключи и значения в одном SaveChanges
Я сначала опускаю все существующие ключи, затем поддерживаю отдельную коллекцию keysIncludingNewOnes
, который начинается с того, что содержит только существующие ключи, но также добавляет к нему все вновь созданные ключи.
Затем, когда я ищу ключевой объект для связи со значением, я смотрю в keysIncludingNewOnes
вместо того, чтобы запрашивать контекст, так как (как вы обнаружили) контекст не знает о новых ключах, пока SaveChanges
,
Вам должно быть относительно легко запомнить о ваших объектах "ожидающих дополнений"; в противном случае у вас может быть слишком долгоживущий контекст, который в целом создает свои собственные проблемы.