Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885

Обновление данных в бд ASP.NET Core / EF

21.03.2017, 10:39. Показов 2966. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Предположим, что у меня есть контрол
C#
1
PurseController
PurseController
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using VendingMachine.Models;
using VendingMachine.Utylity;
using VendingMachine.ViewModel;
 
namespace VendingMachine.Controllers
{
    public class PurseController : Controller
    {
        VendingMachineViewModel _vm;
        IMonetaryOperations _monetaryOperations;
        VendingMachineContext _db;
 
        public PurseController(VendingMachineContext context, IMonetaryOperations monetaryOperations)
        {
            _monetaryOperations = monetaryOperations;
            _db = context;
        }
 
        protected async Task GetVM()
        {
            IQueryable<Purse> purse = _db.PurseSet.Include(p => p.Money);
            IQueryable<Product> product = _db.ProductSet;
 
            _vm = new VendingMachineViewModel();
 
            _vm.Products = await product.AsNoTracking().ToListAsync();
            _vm.Purses = await purse.AsNoTracking().ToListAsync();
        }
 
        public async Task<IActionResult> Index()
        {
            await GetVM();
 
            return View(_vm.Purses);
        }
 
        [HttpPost]
        public async Task<IActionResult> GetPay(int?[] quantity)
        {
            if (!quantity.All(q => q == null))
            {
                await GetVM();
 
                var userMoney = _vm.Purses.Where(p => p.Id == 2)
                    .FirstOrDefault()
                    .Money;
 
                _monetaryOperations.Money = userMoney.ToList();
                _monetaryOperations
                    .SetMoneyList(quantity.Select((q, i) =>
                    new Money
                    {
                        Denomination = i == 2 ? 5 : i == 3 ? 10 : i + 1,
                        Quantity = q != null ? (int)q : 0
                    }), true);
 
 
                userMoney = _monetaryOperations.Money;
 
                _db.MoneySet.UpdateRange(userMoney);
                await _db.SaveChangesAsync();
                return RedirectToAction("Index");
 
            }
 
            return NotFound();
        }
    }
}


В нем, я достаю кошелек и деньги, коряво, не в конструкторе, но достаю во вьюмодел xD
C#
1
2
3
IQueryable<Purse> purse = _db.PurseSet.Include(p => p.Money);
// ----
_vm.Products = await product.AsNoTracking().ToListAsync();
Затем через метод GetPay хочу добавить денежег в свой кошелек, в данном случае пошелек получаю так .Where(p => p.Id == 2).FirstOrDefault() , но не в этом суть.

int?[] quantity возвращает мне 4 значения, где 0й индекс это 1руб, 1 - 2 руб, 2 - 5 руб, 3 - 10 руб. А точнее их количество.

Кладу в свой кошелек денежки, SetMoneyList и хочу произвести обновления в БД, но как это сделать?

C#
1
_db.MoneySet.UpdateRange(userMoney);
Ругается на меня...
Что пишет
nvalidOperationException: The instance of entity type 'Money' cannot be tracked because another instance of this type with the same key is already being tracked. When adding new entities, for most key types a unique temporary key value will be created if no key is set (i.e. if the key property is assigned the default value for its type). If you are explicitly setting key values for new entities, ensure they do not collide with existing entities or temporary values generated for other new entities. When attaching existing entities, ensure that only one entity instance with a given key value is attached to the context.


Но как убрать эти самые значения Кличей, если в любом случае, если даже я и не дам значение ключам, у ключей будет значение, и это 0... Что не так?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.03.2017, 10:39
Ответы с готовыми решениями:

Обновление до ASP .Net Core 2.2
Сейчас обновил VS2017 через инсталлер (VS сама этого потребовала при запуске), но ASP .Net Core автоматически до версии 2.2 не обновился....

ASP.NET Core. Старт - что нужно знать, чтобы стать ASP.NET Core разработчиком?
Попалось хор краткое обзорное видео 2016 года с таким названием - Что нужно знать, чтобы стать ASP.NET MVC разработчиком? Сейчас уже 2018...

Разница между ASP.NET Core 2, ASP.NET Core MVC, ASP.NET MVC 5 и ASP.NET WEBAPI 2
Здравствуйте. Я в бекенд разработке полный ноль. В чем разница между вышеперечисленными технологиями? Есть ли в них что-то общее - могу ли...

2
Эксперт .NET
 Аватар для Usaga
14293 / 9378 / 1352
Регистрация: 21.01.2016
Сообщений: 35,344
21.03.2017, 11:56
EveKS, эта ошибка возникла потому, что EF "помнит" экземпляры объектов Money, что ты достал из БД ранее и ожидает, что ты менять будешь именно их. А ты же подсовываешь ему новые экземпляры.

Меняй оригинальные экзмепляры сущностей.
0
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
21.03.2017, 12:41  [ТС]
Usaga, спасибо =))
Проверил, пока просто "протестировал", всё меняется, сам метод:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        [HttpPost]
        public async Task<IActionResult> GetPay(int?[] quantity)
        {
            if (!quantity.All(q => q == null))
            {
                IEnumerable<Money> purse = (await _db.PurseSet.Include(p => p.Money).AsNoTracking().ToListAsync())
                    .SelectMany(p => p.Money)
                    .Where(p => p.PurseId == 2);
 
                purse.ToList().ForEach(m=>m.Quantity = 10);
 
                _db.MoneySet.UpdateRange(purse);
                await _db.SaveChangesAsync();
                return RedirectToAction("Index");
            }
 
            return NotFound();
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.03.2017, 12:41
Помогаю со студенческими работами здесь

Убрать обновление страницы в проекте asp.net core
Надо убрать обновление страницы при нажатии на кнопку, но с сохранениями свойств. При нажатии на кнопку происходить переадресация на эту же...

Какая разница между ASP .Net Core и ASP .Net Core MVC?
Какая разница между ASP .Net Core и ASP .Net Core MVC? Или я может что-то не так понял? И подскажите пожалуйста еще какие-то книги для...

Стоит ли учить asp.net, если скоро станет asp.net core?
Всем привет Если я правильно понимаю, лучше учить Core ?

ASP.NET Core: разный формат даты контроллера ASP.NET и AngularJS
Собственно, проблему пока еще не разруливал, но уже погуглил. Разный формат даты который использует ASP.NET и AngularJS не позволяет на...

Фоновые процессы в ASP .NET Core и базы данных
Доброго времени суток всем. В общем, нужно сделать в учебных целях веб-приложение - я придумал сделать очередной RSS-агрегатор, в качестве...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
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
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru