powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Чтение данных вставленных в контекст до вызова SaveChanges
9 сообщений из 9, страница 1 из 1
Чтение данных вставленных в контекст до вызова SaveChanges
    #39601871
Тройка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть вопрос, по этому коду. В нем я создаю новую запись и добавляю ее в таблицу контекста entity framework.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
//создаю новую запись
NARYAD_ROUTE_HISTORY historyData = new NARYAD_ROUTE_HISTORY();
historyData.NARYAD_ID = 100;

//добавляю ее в контекст
_ctx.NARYAD_ROUTE_HISTORY.Add(historyData);

//не вызывая _ctx.SaveChanges(); пытаюсь получить запись, но она не находится
var tmp = _ctx.NARYAD_ROUTE_HISTORY.Where(h => h.NARYAD_ID == 100).FirstOrDefault();



В результате его выполнения переменная tmp оказывается null, т.е. запись не находится. Я так понимаю что мой запрос лезет в базу и ищет только то что есть в ней. А новой записи там еще нет. Вопрос в том, как написать запрос что бы он искал еще и по тем записям которые добавлены в контекст, но не сохранены?
Или это неправильная хотелка и надо, например, организовывать транзакцию и вызывать SaveChanges и потом искать добавляемые записи. Ну и уже в самом конце целиком коммитить или откатывать транзакцию
...
Рейтинг: 0 / 0
Чтение данных вставленных в контекст до вызова SaveChanges
    #39601882
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе, у контекста есть коллекция .ChangeTracker.Entries()

Не знаю, есть ли способы проще
...
Рейтинг: 0 / 0
Чтение данных вставленных в контекст до вызова SaveChanges
    #39601925
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тройка,
Цель поиска какая? Сформировали полностью объект. Сбросили в контекст. На коммит сбросите в базу.
...
Рейтинг: 0 / 0
Чтение данных вставленных в контекст до вызова SaveChanges
    #39601940
Тройка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
Есть процедура, в ней я в том числе добавляю запись, потом мне ДО сохранения результатов ее работы в базу нужно вызвать еще одну процедуру, передав ей контекст EF. И по логике работы этой вызываемой процедуры мне нужно что бы если если я вставил запись, но еще не сохранил ее в базу, что бы она была "видна". Т.е. мне нужно учитывать и то что уже есть в базе и то что я только собираюсь туда добавить. Понятно что запись можно передавать параметром и учитывать ее. Но хорошо сейчас она одна, а что делать если их 10 и добавлены они в 10 разных таблиц?

P.S. Я до недавнего времени в основном бизнес логику писал в хранимках базы данных и там такой проблемы не было. Т.е. если я в своей транзакции вставил в таблицу запись но еще ее не закоммитил, то она мне при дальнейших запросах к таблице доступна так же как и уже закоммиченные записи. Возможно, при работе с EF нужен немного другой подход в этом вопросе.
...
Рейтинг: 0 / 0
Чтение данных вставленных в контекст до вызова SaveChanges
    #39601943
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тройка,
То что вы хотите в хибере называется кэш сессии.
Надо глянуть, есть ли это в EF.
...
Рейтинг: 0 / 0
Чтение данных вставленных в контекст до вызова SaveChanges
    #39601950
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тройка,
Ну, вроде тоже самое, только название другое.
Выше Shocker.Pro ответил)
...
Рейтинг: 0 / 0
Чтение данных вставленных в контекст до вызова SaveChanges
    #39601960
Тройка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Тройка,
Ну, вроде тоже самое, только название другое.
Выше Shocker.Pro ответил)
Хм, ну этот код вроде даже работает
Код: c#
1.
2.
3.
4.
var tmp = _ctx.ChangeTracker.Entries<NARYAD_ROUTE_HISTORY>()
                                            .Where(h => h.Entity.NARYAD_ID == 100)
                                            .Select(h => h.Entity).FirstOrDefault()
                             ?? _ctx.NARYAD_ROUTE_HISTORY.Where(h => h.NARYAD_ID == 100).FirstOrDefault();



Причем по идее он сперва ищет в контексте, и если нашел, то в базу не лезет. Запилить что ли генерик экстеншен метод) Для коллекций по идее аналогично можно делать Union от запроса базы и от запроса в кэш
...
Рейтинг: 0 / 0
Чтение данных вставленных в контекст до вызова SaveChanges
    #39601980
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тройка,
Зачем другой код сделали разрабы непонятно.
В хибере что все запрсы к session.
Session.find(имя класса, id).
...
Рейтинг: 0 / 0
Чтение данных вставленных в контекст до вызова SaveChanges
    #39601983
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТройкаПричем по идее он сперва ищет в контексте

Это не правда. В контексте ищутся материализованные ентити сугубо через Find, также используется во внутренней материализации для сокращения количества запросов.

Остальное -- сказки.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Чтение данных вставленных в контекст до вызова SaveChanges
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]