|
1 / 1 / 0
Регистрация: 02.06.2024
Сообщений: 18
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
.NET 5 Один ко многим. Как правильно сохранить дочернюю сущность?05.07.2024, 18:51. Показов 774. Ответов 5
Один ко многим. Как правильно сохранить дочернюю сущность?
Логика кратко: - список сделок; - к каждой сделке прикрепляется список картинок. БД -SQLite. Проект: https://github.com/Dev65432/WpfApp1 Вопрос: Как правильно сохранить дочернюю сущность? Пробую сделать так:
в `_pictureRepository.Update(picture);` получаю ошибку. Текст ошибки: Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=527962 for information on understanding and handling optimistic concurrency exceptions. Перевод ---------- Ожидалось, что работа базы данных затронет 1 строку(ы), но на самом деле это повлияло на 0 строк(ов). Возможно, данные были изменены или удалены с момента загрузки объектов. Смотрите http://go.microsoft.com/fwlink/?LinkId=527962 для получения информации о понимании и обработке исключений оптимистичного параллелизма. В интернетах пишут, что нужно - взять сущность из БД; - обновить свойства; - обновить в БД. Пробую так - см. код ниже Не получается.
Entity Кликните здесь для просмотра всего текста
NamedEntity Кликните здесь для просмотра всего текста
Deal Кликните здесь для просмотра всего текста
Picture Кликните здесь для просмотра всего текста
DbRepository<T> Кликните здесь для просмотра всего текста
DealsRepository Кликните здесь для просмотра всего текста
PicturesRepository Кликните здесь для просмотра всего текста
Deals2ViewModel Кликните здесь для просмотра всего текста
0
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
| 05.07.2024, 18:51 | |
|
Ответы с готовыми решениями:
5
Как правильно создать отношение один ко многим в entity framework Sqlite3, связь один ко многим, как ускорить выборку по ключу или правильно написать select. join Правильно ли связал таблицы (Один к многим)? |
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 06.07.2024, 11:50 | ||
UPDATE ... SET ... WHERE Id = [ваше случайное значение]Естественно, если в базе еще нет изображения с таким ключом, то обновлять нечего — отсюда и ошибка, т.е. надо вызывать либо Update, либо Add в зависимости от того, новая это запись или нет. Если бы изображение с тами ключом уже было в базе, то вы бы поменяли картинку для какой-то другой сделки, т.е. вам надо так же определиться кто отвечает за присваивание первичного ключа новым записям: вы или база. Если вы, то имеет смысл убедиться, что присваиваемое значение новой сущности еще не существует в базе.
1
|
||
|
1 / 1 / 0
Регистрация: 02.06.2024
Сообщений: 18
|
|||||||
| 06.07.2024, 16:23 [ТС] | |||||||
|
Суть вопроса наверное в том как добавить дочернюю сущность в таблицу: - через обновление родительской, используя "_dealsRepository"? - если это возможно. - через непосредственное добавление, используя "_pictureRepository" - это работает. Пример Ситуация: в таблице Pictures сущности Picture с сгенерированным Id нет. Я рассчитываю на такую логику: - создал Picture в коде (проверил, в таблице Pictures сущности Picture с сгенерированным id нет); - добавил новый Picture в список картинок(Pictures) сделки (Deal). Т.е. SelectedDeal.Pictures.Add(picture); - Результат: предыдущей операцией я как бы получается выполнил обновление `SelectedDeal`. И выполняю _dealsRepository.Update(SelectedDeal); - А умный EF дальше сам разберётся что ему делать с Picture: Add в Pictures или Updtae в Pictures. Мои ожидания(цель): не нужно пихать в конструктор Deals2ViewModel другие репозитории кроме, как "_dealsRepository" Или это так не работает? Сейчас.
0
|
|||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||||
| 06.07.2024, 17:01 | ||||||
Сообщение было отмечено cyber7778 как решение
РешениеЕсли приложение стучится в базу напрямую, то в принципе это возможно. Если же с базой работает веб-сервис, к которому уже подключаются клиенты, то этот вариант можно исключить. Есть еще другой способ: использовать метод TrackGraph, позволяющий подключать к контексту весь граф объектов и вручную определять состояние каждого. Хорошо подходит при использовании Aggregate Root в серверной части. В общем, варианты от наиболее простого к наиболее сложному: 1. Использовать отдельные репозитории для каждой сущности 2. Использовать один контекст на протяжении всей сессии и использовать поставляемое в EF остлеживание изменений. 3. Использовать TrackGraph и вручную метить каждый объект как добавленный/измененный/удаленный.
1
|
||||||
|
1 / 1 / 0
Регистрация: 02.06.2024
Сообщений: 18
|
|
| 06.07.2024, 17:16 [ТС] | |
|
kolorotur,
Какой тип данных лучше(практикуется) использовать для id в SQLite? Т.е. - id в SQLite - типа данных? - id в модели Picture - типа данных?
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 06.07.2024, 18:02 | ||
Сообщение было отмечено cyber7778 как решение
Решение1. Традиционно используется числовой тип с автоинкрементом, который присваивается при добавлении записи в таблицу — за все отвечает база и гарантирует*, что дубликатов не будет. 2. Id присваивает клиент, но используется тип, гарантирующий уникальность: UUID или ULID. Лучше подходит для распределенных приложений и для СУБД, умеющих эффективно работать с этими типами (PostgreSQL, например). В принципе, в вашем случае наверное подойдет простой автоувеличивающийся счетчик, т.е. первый вариант. Бонусом EF трактует значение 0 как добавление нового элемента и сама обновит его до присвоенного базой значения после сохранения.
1
|
||
| 06.07.2024, 18:02 | |
|
Помогаю со студенческими работами здесь
6
Правильно ли реализован доступ один ко многим?
Как правильно реализовать отношение "один ко многим". Пример - в первом посте Hibernate как сохранить сущность Обозначьте связи между таблицами БД и тип связи (один-ко-многим, один-к-одному, многие-ко-многим). Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|