Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
63 / 55 / 10
Регистрация: 12.02.2019
Сообщений: 303
1

Странная проблема с UoW?

22.02.2021, 11:34. Показов 2997. Ответов 3

Author24 — интернет-сервис помощи студентам
Форумчане здравствуйте, столкнулся с странной проблемой, и не могу понять где я накосячил.
Есть два метода, Post и соответственно Get
C#
1
2
3
4
5
6
7
8
9
10
11
 
[HttpGet]
        public ActionResult Edit(int id)
        {
            Category p = unitOfWork.Categories.Get(id);
            if (p == null)
            {
                return HttpNotFound();
            }
            return View(p);
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
   
[HttpPost]
        public ActionResult Edit(Category category)
        {
            if (!ModelState.IsValid)
            {
                return View(category);
            }
 
            // С вот этой проверкой ОНО ПРОСТО ОТКАЗЫВАЕТСЯ РАБОТАТЬ.
            if (unitOfWork.Categories.GetAll().Any(x => x.Name.ToLower() == category.Name.ToLower()))
            {
                ModelState.AddModelError("", $"Category *{category.Name}* already exist");
                return View(category);
            }
 
            unitOfWork.Categories.Update(category);
            unitOfWork.Save();
            return RedirectToAction("CategoriesList");
        }
Если в POST методе убрать проверку на имя категории, то всё работает прекрасно, но очевидно не так как нужно.
Ошибка выскакивает в методе репозитория
C#
1
2
3
4
public void Update(Category item)
        {
            db.Entry(item).State = System.Data.Entity.EntityState.Modified;
        }
и выглядит она вот так
Кликните здесь для просмотра всего текста
System.InvalidOperationException: 'Attaching an entity of type 'MVCStore.Domain.Core.Category' failed because another entity of the same type already has the same primary key value. This can happen when using the 'Attach' method or setting the state of an entity to 'Unchanged' or 'Modified' if any entities in the graph have conflicting key values. This may be because some entities are new and have not yet received database-generated key values. In this case use the 'Add' method or the 'Added' entity state to track the graph and then set the state of non-new entities to 'Unchanged' or 'Modified' as appropriate.'

Я игрался и так и сяк, и не пойму в чём проблема, взгляните свежим взглядом, может вы увидите ошибку..
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.02.2021, 11:34
Ответы с готовыми решениями:

NInject, паттерны репозиторий и UoW
Привет всем! Не могу нигде найти вразумительную инфу. Ребят, у меня такой вопрос: Я хочу...

Странная проблема с датами в MSSQL
Есть два файла asp. В первом: SQLOrd='INSERT INTO Orders (OrderDate) Values ('' & Now & '')'...

Странная проблема с delete: ADODB.Recordset (0x800A0E78) Operation is not allowed when the object is closed
есть код set outpostDB = Server.CreateObject('ADODB.Connection') outpostDB.Open "ххх" ...

Странная проблема
Доброго времени суток уважаемые. Появилась проблема. Обьявилась она после установки новых дров на...

3
3458 / 2470 / 695
Регистрация: 02.08.2011
Сообщений: 6,692
22.02.2021, 11:48 2
Лучший ответ Сообщение было отмечено Anvean как решение

Решение

Anvean, это происходит так как EF закэшировала найденную ранее сущность. Далее при установке State идет поиск уже имеющихся сущностей в кэше DbContext-а.
Тут несколько вариантов решения:
1. Либо не кэшировать (с помощью AsNoTracking).
2. Либо искать в кэше, если найден - переписать свойства и установить State в Modified, если не найден - то сразу установить State в Modified.

Добавлено через 5 минут
Цитата Сообщение от Anvean Посмотреть сообщение
// С вот этой проверкой ОНО ПРОСТО ОТКАЗЫВАЕТСЯ РАБОТАТЬ.
            if (unitOfWork.Categories.GetAll().Any(x => x.Name.ToLower() == category.Name.ToLower()))
            {
                ModelState.AddModelError("", $"Category *{category.Name}* already exist");
                return View(category);
            }
Ну так конечно, если вы достали сущность, то при последующем POST-запросе будет найдена эта же самая сущность.
Проверка на уникальность по полю Name предполагает, что сущности должны быть разные в контексте базы (то есть с разным PK). Поэтому надо откорректировать проверку условия:
C#
1
2
// идея - добавить проверку на различные PK
 if (unitOfWork.Categories.GetAll().Any(x => x.Name.ToLower() == category.Name.ToLower() && x.Id != category.Id))
1
63 / 55 / 10
Регистрация: 12.02.2019
Сообщений: 303
22.02.2021, 12:08  [ТС] 3
IamRain, Господи, точно! Спасибо вам большое.
0
3458 / 2470 / 695
Регистрация: 02.08.2011
Сообщений: 6,692
22.02.2021, 12:14 4
Anvean, господь тут не причем.
Магии никакой нету, просто нужно понимать что тут происходит. And how things work.
3
22.02.2021, 12:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.02.2021, 12:14
Помогаю со студенческими работами здесь

Странная проблема с ПК
Всем привет. Проблема с пк произошла. Рассказываю: Вынул шнур основного питания, до этого комп...

Странная проблема с пк
Решил приобрести новый ЦП ( r7 3800x, ранее был r5 2600), установил всё, включаю пк и ничего нету...

Странная проблема
Уже третий месяц в поисковике яндекс выскакивает сообщение о возможном заражении компьютера. Думала...

Странная проблема
С некоторых пор (возможно, после отключения мной одной из важных служб) перестали компилироваться...

Странная проблема
Я решил отработать базовые навыки этого языка т.к. только начинаю с ним знакомиться, а тут вышло...

Странная проблема с Windows 7
Здравствуйте, у меня однажды появилась ошибка при запуске Windows 7 В ошибке было сказано, что у...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru