Отражать все изменения в ObjectContext, не сохраняя в базе данных - PullRequest
3 голосов
/ 02 апреля 2012

Поскольку в транзакции происходит ObjectContext.SaveChanges(), я решил, что для моего приложения будет лучше сначала выполнить все запросы / обновления на ObjectContext, прежде чем один раз вызвать SaveChanges(), чтобы записать данные в базу данных.

Однако это означает, что если я создаю объект и затем запрашиваю ObjectContext, он отрицает его существование (предположительно, потому что база данных еще не обновлена). Я предполагал, что смогу обойти это с некоторыми SaveOptions , но это не похоже на то, что я могу.

Я в основном хочу, чтобы ObjectContext действовал как прокси-сервер, который я могу изменить, поскольку я хочу зафиксировать все за один раз. Есть ли способ, которым я могу достичь этого?

Ответы [ 2 ]

6 голосов
/ 02 апреля 2012

Если вы не сохраняете изменения, ваши новые объекты не существуют в базе данных, и к базе данных не выполняется ни один запрос (= нет запроса Linq to entity).Чтобы получить объекты, добавленные в контекст, но еще не сохраненные, необходимо выполнить запрос ObjectStateManager:

var data = context.ObjectStateManager
                  .GetObjectStateEntries(EntityState.Added)
                  .Where(e => !e.IsRelationship)
                  .Select(e => e.Entity)
                  .OfType<YourEntityType>();
0 голосов
/ 02 апреля 2012

Мне пришлось сделать что-то в этом духе в похожей ситуации:

Учитывая список ключей и значений, где некоторые ключи являются новыми, и желание обновить / вставить ключи и значения водин SaveChanges, я сначала опускаю все существующие ключи, затем поддерживаю отдельную коллекцию keysIncludingNewOnes, которая начинается только с существующих ключей, но также получает все вновь созданные ключи, добавленные вЭто.

Затем, когда я ищу ключевой объект для связи со значением, я смотрю keysIncludingNewOnes, а не запрашиваю контекст, так как (как вы обнаружили) контекст не знает оновые ключи до SaveChanges.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...