Отражать все изменения в 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,

Вам должно быть относительно легко запомнить о ваших объектах "ожидающих дополнений"; в противном случае у вас может быть слишком долгоживущий контекст, который в целом создает свои собственные проблемы.

Другие вопросы по тегам