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

Cannot insert duplicate key in object. Проблема с заказами и продуктами EF core

12.08.2021, 11:31. Показов 8336. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть сущность заказа и есть продукт. Связь многие ко многим (entity framework создал промежуточную таблицу, все вроде ок). Если делать начальное наполнение базы и создать заказ то все нормально, заказ создан в промежуточной таблице ID заказа и ID товара. Когда я создаю новый заказ и помещаю туда в коллекцию продуктов какой-то товар при сохранении бд пищет "Violation of PRIMARY KEY constraint "Таблица продукта". Cannot insert duplicate key in object 'Таблица продукта'. The duplicate key value is "тут ключ". Я так понимаю, что при создании нового заказа и присваивании ему продукта оно хочет создать новый продукт, который уже существует. Как пофиксить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.08.2021, 11:31
Ответы с готовыми решениями:

RecordSet.Update, ошибка 'Cannot insert duplicate key row in object 'Product' with unique index 'IX_Product'
Помогите пожалуйста! Заношу в RECSET новую запись. А когда делаю Update пише ошибку 'Cannot insert duplicate key row in object...

Составление запроса INSERT . ON DUPLICATE KEY
Для составления запрос используется вот такой код: $query = "INSERT INTO kattov (producer, artikul, name_tov, cena, kol)" ....

INSERT . ON DUPLICATE KEY UPDATE без инкремента
Есть ли что подобное, но чтоб поле с автоинкрементом не увеличивалось без надобности?

20
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
12.08.2021, 13:50
В перекрестной таблице должен быть собственный Id. Он у Вас есть ?
0
0 / 0 / 0
Регистрация: 21.04.2019
Сообщений: 22
12.08.2021, 13:52  [ТС]
Нет, там только Id продукта и Id заказа. Как его создать если это таблица созданная автоматически?
0
 Аватар для Andrey-MSK
3354 / 2240 / 388
Регистрация: 14.08.2018
Сообщений: 7,574
Записей в блоге: 4
12.08.2021, 13:55
a_n_t_k, ALTER TABLE (Transact-SQL)

Добавлено через 1 минуту
Цитата Сообщение от a_n_t_k Посмотреть сообщение
entity framework создал
а вот это зря. Лучше всего работать с готовой БД, EF может такого наворотить...
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
12.08.2021, 14:01
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE Orders (
   O_Id INT IDENTITY(1,1) PRIMARY KEY,
   O_Number VARCHAR(MAX) NOT NULL,
   O_Date datetime NOT NULL
)
CREATE TABLE Goods (
   G_Id INT IDENTITY(1,1) PRIMARY KEY,
   G_Name VARCHAR(MAX) NOT NULL,
   G_Price DECIMAL(15,2) NOT NULL
)
CREATE TABLE OrdersGoods (
   OG_Id INT IDENTITY(1,1) PRIMARY KEY,
   OG_O_Id INT REFERENCES Orders(O_Id) NOT NULL,
   OG_G_Id INT REFERENCES Goods(G_Id) NOT NULL,
   OG_Quantity INT NOT NULL,
)
Добавлено через 3 минуты
Цитата Сообщение от a_n_t_k Посмотреть сообщение
Нет, там только Id продукта и Id заказа. Как его создать если это таблица созданная автоматически?
EF создает таблицы из того, что Вы ему суете (классы, написанные Вашими ручками), при этом первое поле класса он считает за собственный Id.
Либо откажитесь от EF (см. [4]), либо создайте базу в SSMS, а EF заставьте ее просто отобразить в модель.
0
 Аватар для Andrey-MSK
3354 / 2240 / 388
Регистрация: 14.08.2018
Сообщений: 7,574
Записей в блоге: 4
12.08.2021, 14:07
a_n_t_k, Добавлю к вышесказанному про руками написать классы. Вот в таком виде EF создаст именно то, что вы запишете и даже попытается добавить отношения между таблицами.
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
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
 
namespace MEFCFDAL.Model
{
    [Table("tblDrawSys", Schema = "dbo")]
    public class DrawSystem
    {
        [Column("ID_DrawSys", TypeName = "int"), Key]
        public int DrawSystemID { get; set; }
 
        [Column("ID_Draw", TypeName = "int")]
        public int DrawID { get; set; }
 
        [Column("List", TypeName = "nvarchar"), StringLength(50)]
        public string DrawSystemSheet { get; set; }
 
        [Column("SystemName", TypeName = "nvarchar"), StringLength(255)]
        public string DrawSystemName { get; set; }
 
        [ForeignKey("DrawID")]
        public Draw Draw { get; set; }
    }
}
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
12.08.2021, 14:15
Работая через Code First, Вы будете постоянно огребать кучу проблем, т.к. у Вас, похоже, практически нет опыта проектирования СУБД.
Любые изменения в таблицах, как и удаление-добавление их, потребуют головоломных разборок с миграцией + скрипты миграции данных. Это намного сложнее и запутаннее, чем проектировать базу в SSMS, а потом "рефлекстировать" ее в модель EF.

Добавлено через 4 минуты
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Вот в таком виде
Для "такого вида" нужно иметь полную модель БД в голове или на "бумаге". Для опытного разработчика типа Вас создать "в голове" небольшую базу (до десятка-двух таблиц) не проблема. EF ее просто "подхватит" и сделает на сервере то, что Вам нужно. Но для новичка типа ТС это все пока китайская грамота.
0
0 / 0 / 0
Регистрация: 21.04.2019
Сообщений: 22
12.08.2021, 14:16  [ТС]
Цитата Сообщение от MsGuns Посмотреть сообщение
Либо откажитесь от EF
это будет проблематично приложение уже построено.
MsGuns, мне кажется тут проблема в связях. Собственно как происходит добавление new Order(Products = list) (list раньше определяется в него берется продукты из бд). Возможно когда оно пытается добавить в заказ то и хочет создать новый продукт, только зачем и почему?
Миниатюры
Cannot insert duplicate key in object. Проблема с заказами и продуктами EF core   Cannot insert duplicate key in object. Проблема с заказами и продуктами EF core   Cannot insert duplicate key in object. Проблема с заказами и продуктами EF core  

0
 Аватар для Andrey-MSK
3354 / 2240 / 388
Регистрация: 14.08.2018
Сообщений: 7,574
Записей в блоге: 4
12.08.2021, 14:19
Цитата Сообщение от MsGuns Посмотреть сообщение
Но для новичка типа ТС это все пока китайская грамота.
Это всё есть в документации по EF. Ну и книги по СУБД естественно никто не отменял. Это вообще должно быть первым к прочтению перед работой с БД

Добавлено через 1 минуту
a_n_t_k, Configure Many-to-Many Relationships in Code-First
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
12.08.2021, 14:26
Имею твердое убеждение, что новичку нужно начинать проектирование БД с Клиента SQL, где все достаточно понятно интуитивно. И только освоив азы, поняв что такое "бизнес-логика сервера", "метаданные сервера", "ограничения", "первичные ключи", "идентификаторы" и т.д., можно пробовать создавать базы в коде c#.
При этом не играет никакой роли, какой именно ORM (EF, Dapper, Sql2db и т.д.) будет использоваться в моделях.

Добавлено через 2 минуты
Цитата Сообщение от a_n_t_k Посмотреть сообщение
это будет проблематично приложение уже построено.
Оно построено неверно. Изначально. Лучше всего будет, если Вы его выбросите, по крайней мере все, что имеет отношение к БД, и сделаете все заново-правильно. Учитывая все, что Вам тут написали.

Добавлено через 53 секунды
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Это всё есть в документации по EF. Ну и книги по СУБД естественно никто не отменял. Это вообще должно быть первым к прочтению перед работой с БД
Ага. Китайский язык тоже, между прочим, учится
0
0 / 0 / 0
Регистрация: 21.04.2019
Сообщений: 22
12.08.2021, 14:35  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Configure Many-to-Many Relationships in Code-First
переделал все как тут, ничего не изменилось. Сделал как на ms docs тоже ничего не изменилось. Та же ошибка. Может у вас есть какие-то догадки. Я понимаю, что я новичок и тд, но БД работала хорошо, CRUD сервисы работали даже при том, что у меня от того товара наследуются другие товары.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
12.08.2021, 14:40
По поводку "построенного приложения".
Любое клиентское приложение (консольное - не исключение) состоит минимум из двух частей: интерфейс + внутренняя работа с данными. Практика показывает, что наиболее ресурсоемкая (до 90%) - именно интерфейс.
Ноиболее распространенная ошибка новичков - смешивать эти две части в одном коде, например в коде формы (форм).
И тогда малейшая переделка "базы" приводит к тому, что нужно править код формы, а он может быть весьма обширен и запутан.
Чтобы этого не происходило, весь код работы с БД выносят в отдельный юнит-класс Repository, где и пишутся все извлечения и изменения "базовых" данных в виде методов. Эти методы работают независимо от форм: они получают некоторые параметры (например значение фильтров, колонок сортировки) и возвращают класс модели либо коллекцию моделей. Либо получают модель и добавляют или изменяют ее в БД.
Т.е. "формы" работают с классами моделей, нужными для отображения или ввода информации. При этом что там в базе на самом деле (какие таблицы, поля и связи), их не волнует - со всем этим разбирается репозиторий. Как результат - при внесении изменений в базу (новые таблицы, колонки, связи) правится только код репозитория. Код всех форм при этом совершенно не трогается - он просто работает на "новой" базе точно так же, как и на "старой".

Добавлено через 2 минуты
Цитата Сообщение от a_n_t_k Посмотреть сообщение
у меня от того товара наследуются другие товары
Еще одна методологическая ошибка. Вы освоили ООП и это здорово. Но в СУБД нет никакого наследования (Oracle не берем) - отсюда будете получать многочисленные грабли с косяками
0
 Аватар для Andrey-MSK
3354 / 2240 / 388
Регистрация: 14.08.2018
Сообщений: 7,574
Записей в блоге: 4
12.08.2021, 14:53
Цитата Сообщение от a_n_t_k Посмотреть сообщение
Может у вас есть какие-то догадки.
Внешние ключи и связи
У вас должен быть либо первичный ключ в этой таблице, либо уникальный, созданный на паре связующих ID

Добавлено через 3 минуты
a_n_t_k, и чтобы EF такое понял, нужно добавлять в классы данных аннотации, пример я показывал выше.
0
0 / 0 / 0
Регистрация: 21.04.2019
Сообщений: 22
12.08.2021, 14:56  [ТС]
Andrey-MSK, Вот такая должна быть таблица? Справа пример хранения, который создается при инициализации БД.
Миниатюры
Cannot insert duplicate key in object. Проблема с заказами и продуктами EF core  
0
 Аватар для Andrey-MSK
3354 / 2240 / 388
Регистрация: 14.08.2018
Сообщений: 7,574
Записей в блоге: 4
12.08.2021, 15:03
a_n_t_k, да, только данные туда вы должны вставлять сами при формировании чего вам там надо (заказа или чего...), и данные должны вставляться в оба поля ОДНОВРЕМЕННО, одной командой INSERT.
Пары должны быть УНИКАЛЬНЫМИ!!! Один ID заказа - один ID типа товара.
0
0 / 0 / 0
Регистрация: 21.04.2019
Сообщений: 22
12.08.2021, 15:10  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Один ID заказа - один ID типа товара
Так а как быть если в одном заказе много товаров?
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
одной командой INSERT
там я просто добавил через entity
C#
1
context.orders.add(new order{OrderProducts = list});
0
 Аватар для Andrey-MSK
3354 / 2240 / 388
Регистрация: 14.08.2018
Сообщений: 7,574
Записей в блоге: 4
12.08.2021, 15:20
Цитата Сообщение от a_n_t_k Посмотреть сообщение
Так а как быть если в одном заказе много товаров?
это не означает что товаров может быть только один
Это означает то, что товар в заказе не повторяется, а присутствует там только один раз, и таких разных товаров может быть хоть 100500.
Ваша ошибка как раз и выдает то, что такая пара уже существует:
1. Заказ 001 - Ботинки 001
2. Заказ 001 - Зонтики 003
3. Заказ 001 - Туфли 006
4. Заказ 001 - Ботинки 001 -> ваша ошибка об уникальности ключа
Понятно теперь?

Добавлено через 6 минут
a_n_t_k, всё это от того, что вы не разобрались в предмете с которым работаете.
Предмет -> СУБД. Если бы вы четко понимали как работает СУБД, то этот вопрос бы даже не возник
0
0 / 0 / 0
Регистрация: 21.04.2019
Сообщений: 22
12.08.2021, 15:29  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
что такая пара уже существует
смотрите, я удалил все заказы, решил создать новый (т.е пар никаких не существует), но опять та же ошибка.
0
 Аватар для Andrey-MSK
3354 / 2240 / 388
Регистрация: 14.08.2018
Сообщений: 7,574
Записей в блоге: 4
12.08.2021, 15:39
Цитата Сообщение от a_n_t_k Посмотреть сообщение
смотрите, я удалил все заказы, решил создать новый (т.е пар никаких не существует), но опять та же ошибка.
схему БД из SSMS покажите
0
0 / 0 / 0
Регистрация: 21.04.2019
Сообщений: 22
12.08.2021, 15:43  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
схему БД из SSMS покажите
Вот
Миниатюры
Cannot insert duplicate key in object. Проблема с заказами и продуктами EF core   Cannot insert duplicate key in object. Проблема с заказами и продуктами EF core   Cannot insert duplicate key in object. Проблема с заказами и продуктами EF core  

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.08.2021, 15:43
Помогаю со студенческими работами здесь

Insert into в один столбец ON DUPLICATE KEY UPDATE
Eсть таблица product со столбцами idProduct, ProductName. idProduct (PK, NN, UQ, AI). ProductName(NN). Нужно вставить наименование...

Некорректная работа команды INSERT INTO ON DUPLICATE KEY UPDATE
Добрый день! Не удается выполнить запрос. БД Access, работаю через ADOQuery, что не так делаю, подскажите пожалуйста. INSERT INTO...

Violation of Primary key constraint 'PK_otdel'. Cannot insert dupllicate key in object 'dbo.otdel'.
void __fastcall TAddOtdForm::AddOtdButton1Click(TObject *Sender) { int kodotd; MainForm->OtdelADOQuery1->Last(); kodotd =...

DUPLICATE KEY
есть база в которой хранится уникальная информация поле products , в ней два поля tine_addition и time_update, в которых хранится время и...

ON DUPLICATE KEY UPDATE
Помогите пожалуйста, я пытаюсь сделать SQL запрос который вставляет запись в таблицу, но если есть запись в которой val1=val11 and...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru