Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
5 / 5 / 0
Регистрация: 10.12.2020
Сообщений: 103

Сохранение связанных данных ef core

13.12.2022, 00:46. Показов 649. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть сущность Product:

C#
1
2
3
4
5
6
    public class Product 
    {
        public long Id {get;set;}
        public  virtual Category Category { get; set; }
        public string Name { get; set; }
    }
Есть сущность Category:

C#
1
2
3
4
5
6
    public class Category 
    {
        public long Id {get;set;}
        public virtual IEnumerable<Product> Product { get; set; }
        public string Name { get; set; }
    }
Допустим, в базе есть категория: Category(){Id = 1, Name="SomeName"}

Пользователь хочет создать новый продукт, используя уже существующую категорию. На вход приходит viewModel продукта с теми же полями, что и dbModel(только вместо Category - CategoryViewModel). Дальше я маплю viewModel в dbModel и пытаюсь сохранить в базу(объект Product с полем Category). EF ругается, что такой Categoty уже есть. Однако, если включить LazyLoading и в Product dbModel засунуть вместо Category - CategoryProxies(POCO), то все сохраняется без проблем. Почему так?

Добавлено через 6 минут
Вот так работает
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
        public async Task<IActionResult> CreateProduct(ProductViewModel productViewModel)  //trying to save category entity that already exists
        {
            if (ModelState.IsValid) 
            {
                var dbModel = _mapper.Map<Product>(productViewModel);
                var category = await _categoryRepository.GetByIdAsync(dbModel.Category.Id); //тут Proxies
 
                if (category == null)
                {
                    return BadRequest();
                }
 
                try
                {
                    dbModel.Category = category;
                    await _productRepository.SaveAsync(dbModel);
                }
                catch (Exception) 
                {
                    return BadRequest();
                }
 
                return Ok(_mapper.Map<ProductViewModel>(dbModel));
 
            }
 
            return BadRequest();
        }

А вот так - нет
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
        public async Task<IActionResult> CreateProduct(ProductViewModel productViewModel)  //trying to save category entity that already exists
        {
            if (ModelState.IsValid) 
            {
                var dbModel = _mapper.Map<Product>(productViewModel);
                var categoryFromModel = dbModel.Category; //Тут лежит именно DbModel
 
                if (!await _categoryRepository.IsExistsAsync(dbModel))
                {
                    return BadRequest();
                }
 
                try
                {
                    await _productRepository.SaveAsync(dbModel);
                }
                catch (Exception) 
                {
                    return BadRequest();
                }
 
                return Ok(_mapper.Map<ProductViewModel>(dbModel));
 
            }
 
            return BadRequest();
        }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.12.2022, 00:46
Ответы с готовыми решениями:

Сохранение связанных данных в несколько таблиц сразу
Ситуация: в БД (MySQL - что не принципиально) имеется Таблица &quot;Абитуриент&quot; с автоинкрементным ключем, которая связанна отношениями...

NET Core. Представление для выбора связанных данных EF
Собственно проблема. Делаю от нечего делать такую фигню. Имеем два класса для DbContext EF. public class Klient { public...

Сохранение данных с формы в несколько связанных таблиц базы данных Access
Очень нужна помощь! У меня есть база данных (Microsoft Access), которая состоит из 5 таблиц. В DataGridView я загружаю нужные мне...

3
403 / 265 / 69
Регистрация: 12.04.2020
Сообщений: 1,404
13.12.2022, 00:58
Цитата Сообщение от Alex_Zhyr Посмотреть сообщение
Есть сущность Product:
C#
1
2
3
4
5
6
7
public class Product 
    {
        public virtual long Id {get;set;}
        public virtual long CategoryId { get; set; }
        public virtual Category Category { get; set; }
        public virtual string Name { get; set; }
    }
C#
1
2
3
4
5
                var dbModel = _mapper.Map<Product>(productViewModel);
                var category = await _categoryRepository.GetByIdAsync(dbModel.Category.Id);
...
                    dbModel.CategoryId = category.Id;
                    await _productRepository.SaveAsync(dbModel);
переписывайте
1
5 / 5 / 0
Регистрация: 10.12.2020
Сообщений: 103
13.12.2022, 01:06  [ТС]
Ну это я понял) Я не понимаю почему ef не позволяет сделать иначе.
0
Эксперт .NET
 Аватар для Usaga
14308 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,410
13.12.2022, 02:22
Цитата Сообщение от Alex_Zhyr Посмотреть сообщение
Однако, если включить LazyLoading
Плохая практика использовать этот механизм. Бьёт по производительности.

Цитата Сообщение от Alex_Zhyr Посмотреть сообщение
Я не понимаю почему ef не позволяет сделать иначе.
Потому, что вы EF'у говорите создать новую категорию с конфликтующим ID. После маппинга-то получается новая сущность категории и товара, которые в кеше не лежат. EF как должен понять, что такая категория уже есть и её не надо добавлять? Третий глаз отрастить?)

У вас уже во вью модели есть ID категории. В базу не надо лезть за категорией. И сущность категории создавать при мапинге тоже не надо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.12.2022, 02:22
Помогаю со студенческими работами здесь

Сохранение данных связанных таблиц
Доброго времени суток! Очень нужна помощь,уже столько времени мучаюсь( На форме присутствуют 4 таблицы,одна из которых родительская,а 3...

Сохранение данных в БД в связанных таблицах
Всем привет! У меня есть 4 таблицы, из которых 3 завязаны на одну многие ко многим (группа, предмет, курс на специальность). В программе я...

Сохранение связанных таблиц
Доброго времени суток! Проблема заключается в том что у меня есть три таблицы в БД, Специальность-&gt;Группа-&gt;Абитуриент...

Сохранение связанных моделей Yii
Тема часто обсуждалась в инете, но всеравно недостаточно. В примерах порядок действия таков: в методе afterSave основной модели вызывается...

Yii сохранение связанных моделей
Добрый день, пишу новый проект на Yii, стараюсь избегать костылей =) Есть форма добавления нового объекта, с объектом связано...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значения справочника
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
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru