|
15 / 5 / 1
Регистрация: 28.11.2013
Сообщений: 56
|
||||||||||||||||
MS SQL Грамотно добавлять, удалять, обновлять при foreach31.07.2018, 11:43. Показов 6486. Ответов 44
Добрый день.
Приложение раз в две минуты синхронизирует данные с сервера. Если есть изменения, получает коллекции с итемами по типу изменения updatedItems, createdItems и deleteditems. Затем прохожусь по каждой коллекции и внутри цикла в зависимости от типа ChangeType добавляю: Кликните здесь для просмотра всего текста
обновляю: Кликните здесь для просмотра всего текста
и удаляю: Кликните здесь для просмотра всего текста
Грубо говоря, при создании foreach загоняет все в лист и 1 раз InsertAllOnSubmit(). При удалении каждый раз внутри foreach sql-запрос на удаление по id (т.е. если 10 или 20 удаленных записей, то будет 10 или 20 запросов). При обновлении каждый раз внутри foreach получаю элемент, обновляю все значения и SubmitChanges(), при этом на сколько я понял linq кэширует, сверяет запись и затем обновляет, т.е. вон сколько всего. Вопрос: как сделать грамотно? Или и так сойдет?)
0
|
||||||||||||||||
| 31.07.2018, 11:43 | |
|
Ответы с готовыми решениями:
44
Как добавлять и удалять записи из БД и будет ли это приложение (будильник) работать на других ПК Как в datagrid добавлять и удалять колонки Как удалять и добавлять вертексы в шейдер? |
|
1655 / 1154 / 173
Регистрация: 23.07.2010
Сообщений: 6,914
|
|
| 01.08.2018, 16:19 | |
|
2
|
|
|
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,114
|
|
| 01.08.2018, 16:57 | |
|
Всё время забываю про эту замечательную команду.
0
|
|
|
15 / 5 / 1
Регистрация: 28.11.2013
Сообщений: 56
|
||||||||||||||||||||||
| 01.08.2018, 18:38 [ТС] | ||||||||||||||||||||||
|
Тем времинем вроде пересел на EF. Кликните здесь для просмотра всего текста
удаляю:
Т.е. удаляю и обновляю я по-прежнему каждый раз по 1, и добавляю как и раньше весь список скопом, но теперь с помощью великого AddRangeПозже надо попробовать как-то из списка deleteditems собрать их айдишники в List<int> IDs и попробовать что-то типа
RemoveRange удалил одним запросом. AddRange и RemoveRange нормальны в плане правильности?А вот с обновлением не понятно что делать. Не знаю как батч-запросом. Что в linq, что в EF каждый раз нужно трогать значения объекта и сохраняться.
0
|
||||||||||||||||||||||
|
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,114
|
||||||||||||
| 02.08.2018, 06:52 | ||||||||||||
Сообщение было отмечено spektr_011 как решение
Решение
spektr_011, так было бы правильнее:
удаление:
1
|
||||||||||||
|
15 / 5 / 1
Регистрация: 28.11.2013
Сообщений: 56
|
|||
| 02.08.2018, 11:18 [ТС] | |||
|
0
|
|||
|
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,114
|
|
| 02.08.2018, 11:32 | |
|
spektr_011, можно и один раз всё сделать. EF сам всё обновит, добавит и обновит. Только если записей много (суммарно), то контекст раздуется и процесс затянется.
В три подхода данные вносить - нормально.
0
|
|
|
15 / 5 / 1
Регистрация: 28.11.2013
Сообщений: 56
|
||
| 02.08.2018, 14:15 [ТС] | ||
|
Usaga,
itemsToDelete должны быть сущности из db.Table, подлежащие удалению, а не из deleteditems. deleteditems это и так IEnumerable<ItemClass> с удаленными в источнике итемами. У них классы то разные (если я правильно выразился). В общем как-то эта строка не работает. Как выделить сущности из таблицы, чьи id совпадают с id объектов из deleteditems?
0
|
||
|
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,114
|
|
| 02.08.2018, 17:38 | |
|
spektr_011, что именно не работает?
Вообще, данный пример показывает главную идея: чтобы удалить запись её не обязательно предварительно из базы вытаскивать, достаточно создать класс того же типа и назначить ему ID записи, что нужно удалить. Добавлено через 1 минуту Если не компилируется из-за двойного равно ( ==), то это ошибка. Там должно быть присваивание)
0
|
|
|
15 / 5 / 1
Регистрация: 28.11.2013
Сообщений: 56
|
||
| 02.08.2018, 18:03 [ТС] | ||
|
0
|
||
|
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,114
|
|
| 02.08.2018, 18:12 | |
|
0
|
|
|
15 / 5 / 1
Регистрация: 28.11.2013
Сообщений: 56
|
|
| 02.08.2018, 18:34 [ТС] | |
|
Usaga, не так выразился, проверяет что в коллеции что-либо есть, так же?
0
|
|
|
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,114
|
|
| 02.08.2018, 18:45 | |
|
Да, но если сама ссылка никуда не указывает (null), то такую ошибку и получите. И ещё: вы на какой строке это исключение-то ловите?)
0
|
|
|
15 / 5 / 1
Регистрация: 28.11.2013
Сообщений: 56
|
||||||||
| 02.08.2018, 18:51 [ТС] | ||||||||
|
зы: с удалением по прежнему запара. Добавлено через 4 минуты
0
|
||||||||
|
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,114
|
||
| 02.08.2018, 18:55 | ||
|
Разница в том, что при выгрузке данных EF сначала ищет объект в контексте и только потом материализует (и ложит в контекст, если нет AsNoTracking). Чем больше объектов в контексте, тем дольше каждая последующая выборка.
Так же и при SaveChanges - происходит перебор всех объектов в кеше и определение какие из них изменились (и что в них изменилось). Гораздо эффективнее сделать это один раз после того, как все данные были получены и изменены. AsNoTracking сделает так, что выгрузка записи не приведёт к походу в кеш контекста, сколько бы мы до этого записей не вытащили, скорость выгрузки последующих не изменится. Записи в кеш добавятся сразу, за раз с одновременным указанием того, что они изменены (State = Modified). Когда будет вызов SaveChanges() EF увидит состояние Modified и не полезет в сущность смотреть, что именно было изменено. Т.е. такой вариант будет заметно эффективнее. Добавлено через 1 минуту null. Вариантов два: или deletedItems или s.Id у одной из записей.
1
|
||
|
15 / 5 / 1
Регистрация: 28.11.2013
Сообщений: 56
|
||||||||
| 02.08.2018, 19:25 [ТС] | ||||||||
|
Добавлено через 29 минут Но теперь исключение на строчке
Символично номер строки 404)
0
|
||||||||
|
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,114
|
|||||||
| 02.08.2018, 19:34 | |||||||
0
|
|||||||
|
15 / 5 / 1
Регистрация: 28.11.2013
Сообщений: 56
|
||
| 02.08.2018, 19:52 [ТС] | ||
|
Usaga,
0
|
||
|
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,114
|
|
| 02.08.2018, 20:05 | |
|
spektr_011, естественно, что в контексте не должно быть сущностей одного типа с идентичными значениями первичных ключей.
0
|
|
|
15 / 5 / 1
Регистрация: 28.11.2013
Сообщений: 56
|
|||||||
| 03.08.2018, 11:56 [ТС] | |||||||
|
Usaga,
теперь новое исключение:
Немного поигрался, если при создании
0
|
|||||||
|
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,114
|
|
| 03.08.2018, 12:01 | |
|
0
|
|
| 03.08.2018, 12:01 | |
|
Как правильнее добавлять и удалять заголовки сообщений? Как динамически добавлять/удалять страницы ViewPager Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности.
Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
|
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version
Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|