|
Модератор
|
|||||||||||||||||||||
Entity Framework: Запись значений в иммутабельные типы05.01.2025, 00:05. Показов 1083. Ответов 11
Метки entity framework (Все метки)
Столкнулся с ситуацией, которую даже не знаю куда копать.
Есть иммутабельный тип-сущность:
Изменено значение иммутабельного свойства! Каким образом? Здесь даже рефлексия не поможет!
0
|
|||||||||||||||||||||
| 05.01.2025, 00:05 | |
|
Ответы с готовыми решениями:
11
В чем разница между Entity Framework и Entity Framework Core? Не сохраняет запись в БД Entity Framework
|
|
Модератор
|
|||||||||||||
| 05.01.2025, 00:53 [ТС] | |||||||||||||
|
Как избежать - это другое. Мне нужно обновить сущность в локальном кеше представляемом через ObservableCollection:
Но в данном вопросе, мне не понятен сам механизм изменения иммутабельного свойства. Добавлено через 4 минуты
0
|
|||||||||||||
|
|
||
| 05.01.2025, 01:28 | ||
|
(если я что-то не знаю, то узнаю если в чём-то ошибся
я уже давно с EF не работаю )Но разве здесь не работает так как и должно работать? Сущность изменили в БД, Observable коллекция это отловила и обновила. Сущность изменилась везде. Что не так? ![]() Это же EF, и все объекты - прокси-объекты, а не конечные, "неизменяемые". Скорее всего не свойство изменилось, а весь объект подменился. Ради интереса получи какой-то IntPtr или что-то круто-уникальное. И тогда уже сравни. Убедишься (по моей теории) что это разные объекты. Добавлено через 7 минут
0
|
||
|
Модератор
|
||||||||||||||||||||||||||||||||
| 05.01.2025, 01:46 [ТС] | ||||||||||||||||||||||||||||||||
|
Так как экземпляры иммутабельны, то для изменения изменения свойства, нужно создать новый экземпляр. Но экземпляр остаётся тот же (с номером #16, в данном примере). Вот именно механизм изменения иммутабельного свойства мне и не понятен. У сущности в локальном кеше изменилось свойство. Но так как экземпляр остался прежним, то ObservableCollection не обновляется. Если получить типы, то у всех будет исходный тип. Никакаой виртуализации здесь нет. Можно даже запечатать тип.
Кроме того, предыдущее получение из кеша я сохраняю в локальной переменой: ExampleData inst = examples!.Find(3)!;.И EF ни как не может повлиять на внешнюю локальную переменную. Поэтому изменение происходит в том же самом экземпляре - это без вариантов.
0
|
||||||||||||||||||||||||||||||||
|
|
||||||
| 05.01.2025, 02:01 | ||||||
|
https://learn.microsoft.com/ru... work-6.2.0
Не? Самым простым решением здесь всё-таки использовать нотрекинг. Поставь его глобально (на весь контекст) и снова проверь. Результат будет так же? Унаследоваться нельзя. Но не "запечатать", заблочить, заимунировать и т.п. же
0
|
||||||
|
Модератор
|
||||||||||||||||
| 05.01.2025, 02:15 [ТС] | ||||||||||||||||
|
И при изменении в локальном кеше происходит изменения и в ней. Но так как экземпляр не заменяется, то изменения не происходит. Вот я именно и интересуюсь, за механизм используемый EF для изменения свойства "только для чтения". А каким образом для иммутабельных? Я думал, что через замену экземпляра. Оказалось, что каким-то неведомым образом меняется свойство "только для чтения". Обычно меняют через рефлексию. Но в данном случае, рефлексия не помощник:
sealed - это и есть "запечатать" для наследования. То что свойство иммутабельно это следует из его объявления:
Кроме того типы экземпляров считываются и выводятся. Поэтому гарантированно, что здесь точно нет наследования.
0
|
||||||||||||||||
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
|
||||||
| 05.01.2025, 09:11 | ||||||
|
ObservableCollection дает только реакцию на изменение самой коллекции (добавление/удаление элемента). Это на фронте веб-фреймворки (react, vue, вроде angular в недефолтном change detection режиме) перерисовывают если ссылки обновляются. Добавлено через 6 минут
0
|
||||||
|
Модератор
|
||
| 05.01.2025, 10:22 [ТС] | ||
|
И вопрос у меня не про отсутствие реакции ObservableCollection. Вопрос у меня: Каким образом, используя какой механизм EF изменяет значение свойств "только для чтения" (иммутабельных свойств)? Для примера, попробуйте "руками" повторить, то что желает EF: создайте любую коллекцию из ExampleData измените значение любого свойства одного из элементов этой коллекции, не заменяя сам экземпляр.Напрямую или используя рефлексию - это не выйдет сделать. Но у EF это получается сделать.
0
|
||
|
|
||
| 05.01.2025, 10:26 | ||
|
Добавлено через 1 минуту Судя по до сих пор не закрытой теме https://github.com/dotnet/efcore/issues/11457 , там всё не просто.
1
|
||
|
Модератор
|
|||||||
| 05.01.2025, 10:27 [ТС] | |||||||
Сообщение было отмечено Элд Хасп как решение
Решение
Я даже изменил реализацию сущности, чтобы EF не обращался к анонимным автополям:
Честно говоря, хлипкая конструкция. Имена могут быть другими, поля могут быть тоже объявлены "только для чтения". Вопрос на свой ответ я нашёл. Теперь буду думать как более оптимально реализовать то что мне нужно. Но это уже в другой теме.
0
|
|||||||
|
Модератор
|
|||
| 05.01.2025, 11:05 [ТС] | |||
|
Добавлено через 37 минут https://github.com/dotnet/efco... 2571534279
0
|
|||
| 05.01.2025, 11:05 | |
|
Помогаю со студенческими работами здесь
12
Как удалить запись из datagridview? Entity Framework Entity Framework. Проблема с получением значений навигационными свойствами Entity FrameWork заменяет запись копией при сохранении Entity Framework не удаляется связанная по внешнему ключу запись Удалить запись из базы данных с использованием Entity Framework Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y
Z4Tv2zpXVVo
https:/ / github. com/ shumilovas/ med2. git
|
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор по наименованию группы. . .
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
|
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит значение перечислений.
/ / Событие "НачалоВыбора" реквизита на форме. . .
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|