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

Не могу удалить запись из таблицы, которая является внешним ключом

21.09.2022, 15:31. Показов 1363. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Использую EntityFramework. Пытаюсь удалить строку из таблицы "Reserve", поле ReserveId является внешним ключом для таблицы Signal. Получаю ошибку: "The DELETE statement conflicted with the REFERENCE constraint "FK_Signal_Reserve_ReserveId"..." Вот, как выглядит запрос, создающий таблицу сигнал:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE [dbo].[Signal] (
    [SignalId]          INT            IDENTITY (1, 1) NOT NULL,
    [MeasureUnitId]     INT            NOT NULL,
    [GroupId]           INT            NOT NULL,
    [ReserveId]         INT            NULL,
    [RequirementId]     INT            NOT NULL,
    CONSTRAINT [PK_Signal] PRIMARY KEY CLUSTERED ([SignalId] ASC),
    CONSTRAINT [FK_Signal_Group_GroupId] FOREIGN KEY ([GroupId]) REFERENCES [dbo].[GROUP] ([GroupId]) ON DELETE CASCADE,
    CONSTRAINT [FK_Signal_MeasureUnit_MeasureUnitId] FOREIGN KEY ([MeasureUnitId]) REFERENCES [dbo].[MeasureUnit] ([MeasureUnitId]) ON DELETE CASCADE,
    CONSTRAINT [FK_Signal_Requirement_RequirementId] FOREIGN KEY ([RequirementId]) REFERENCES [dbo].[Requirement] ([RequirementId]) ON DELETE CASCADE,
    CONSTRAINT [FK_Signal_Reserve_ReserveId] FOREIGN KEY ([ReserveId]) REFERENCES [dbo].[Reserve] ([ReserveId])
);
Вот модель таблицы Signal:
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
public class Signal
{
    [Key]
    public int SignalId { get; set; }
 
    public int MeasureUnitId { get; set; }
 
    public int GroupId { get; set; }
 
    public int? ReserveId { get; set; }
 
    public int RequirementId { get; set; }
 
    public MeasureUnit MeasureUnit { get; set; }
    public Group Group { get; set; }
    public Reserve Reserve { get; set; }
    public Requirement Requirement { get; set; }
 
    public Signal()
    {
        Group = new Group();
        Reserve = new Reserve();
        Requirement = new Requirement();
        MeasureUnit = new MeasureUnit();
    }
}
Насколько я понял, в
SQL
1
CONSTRAINT
для внешнего ключа ReserveId должно быть вот так:
SQL
1
CONSTRAINT [FK_Signal_Reserve_ReserveId] FOREIGN KEY ([ReserveId]) REFERENCES [dbo].[Reserve] ([ReserveId]) ON DELETE SET NULL
, но я не могу заставить EF генерить эту запись. Пытался при инициализации контекста указывать:
C#
1
2
3
4
modelBuilder.Entity<Reserve>()
                .HasMany(r => r.Signals)
                .WithOne(s => s.Reserve)
                .OnDelete(DeleteBehavior.SetNull);
, результат нулевой

Были мысли о том, что Set Null при наличии внешнего ключа в виде nullable-войства - стандартное поведение, но откуда тогда берется моя ошибка? Помогите!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.09.2022, 15:31
Ответы с готовыми решениями:

Заполнение таблицы с внешним ключом
Добрый день. Имею следующие таблицы: (фото 1) И имею запрос на сохранение в таблицу basket: try { ...

Проблема с внешним ключом таблицы
Доброго времени суток, у меня есть база данных, в ней есть несколько таблиц для сущности врач (схема связей на картинке). С этой базой...

Добавить запись в таблицу с внешним ключом
Есть 3 таблицы: Category(idCategory, name), таблица Providers(idProviders, name, adress, phoneNumber) и таблица Products(idProduct, name,...

11
Эксперт .NET
 Аватар для Usaga
14308 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,409
21.09.2022, 17:11
Vanka03, вы базу через миграции создаёте что ли?
0
4 / 4 / 0
Регистрация: 01.11.2013
Сообщений: 216
21.09.2022, 21:02  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
вы базу через миграции создаёте что ли?
А как Вы это определили?

Добавлено через 12 минут
Цитата Сообщение от Usaga Посмотреть сообщение
вы базу через миграции создаёте что ли?
Я точно не знаю, используется ли именно механизм миграции, но база загружается из Excel файла (так проще отлаживаться). Т.е. создается контекст, база данных удаляется, по контексту создается новая, в нее загружаются листы из файла в таблицы. Это миграция называется?
0
Эксперт .NET
 Аватар для Usaga
14308 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,409
22.09.2022, 05:55
Цитата Сообщение от Vanka03 Посмотреть сообщение
А как Вы это определили?
По характеру вопроса)
Цитата Сообщение от Vanka03 Посмотреть сообщение
но я не могу заставить EF генерить эту запись.
Цитата Сообщение от Vanka03 Посмотреть сообщение
Я точно не знаю, используется ли именно механизм миграции, но база загружается из Excel файла (так проще отлаживаться). Т.е. создается контекст, база данных удаляется, по контексту создается новая, в нее загружаются листы из файла в таблицы. Это миграция называется?
Нет. Миграция - когда EF формирует и модифицирует схему базы. Вы не можете не знать, что это просиходит (или не происходит).
0
4 / 4 / 0
Регистрация: 01.11.2013
Сообщений: 216
22.09.2022, 08:06  [ТС]
P.S. каскадное удаление не подходит.
Цитата Сообщение от Usaga Посмотреть сообщение
Нет. Миграция - когда EF формирует и модифицирует схему базы. Вы не можете не знать, что это просиходит (или не происходит).
Нет, миграцию я не использую. Я использую вот это:
C#
1
2
3
 
   Database.EnsureDeleted();   // удаляем бд со старой схемой
   Database.EnsureCreated();   // создаем бд с новой схемой
Я правильно понимаю, что у меня есть модели, в моделях указаны свойства и нав. свойста, некоторые с атрибутами, модели добавляются в контекст и из контекста EF сам создает схему данных? Я так понял, что это не миграция, для миграции нужно использовать объекты класса Migration, я этого не делаю.

Мы отдаляемся от темы, или мне кажется?)
0
Эксперт .NET
 Аватар для Usaga
14308 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,409
22.09.2022, 09:01
Цитата Сообщение от Vanka03 Посмотреть сообщение
P.S. каскадное удаление не подходит.
Так его в схеме базы и нет.

Цитата Сообщение от Vanka03 Посмотреть сообщение
Нет, миграцию я не использую. Я использую вот это:
Это её вариант. Вам EF создаёт базу по модели данных.

Добавлено через 8 минут
Моя рекомендация: создайте базу руками. С какой нужно схемой. Или возьмите ту, что вам EF сгенерировал и руками поправьте. И сделайте бекап. Чтобы переиспользовать её и далее.
1
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,689
Записей в блоге: 2
22.09.2022, 10:12
Цитата Сообщение от Vanka03 Посмотреть сообщение
Я правильно понимаю, что у меня есть модели, в моделях указаны свойства и нав. свойста, некоторые с атрибутами, модели добавляются в контекст и из контекста EF сам создает схему данных? Я так понял, что это не миграция, для миграции нужно использовать объекты класса Migration, я этого не делаю.
Покажите больше кода.
Модель Reserve и его SQL скрипт.

Мои предположения
- вы не сказали какой тип БД. Вдруг он не поддерживает такой режим.
- где-то создалась рекурсия и умный EF это нашёл и не прописал в этой модели избыточную настройку.
0
4 / 4 / 0
Регистрация: 01.11.2013
Сообщений: 216
22.09.2022, 10:31  [ТС]
Код модели Reserve:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Reserve
{
    [Key]
    [ForeignKey("Signal")]
    public int ReserveId { get; set; }
 
    public int RequirementId { get; set; }
 
    [Display(Name = "Резерв")]
    public string ReserveName{ get; set; }
 
    [Required]
    public virtual ICollection<Signal> Signals { get; set; }
 
    public Requirement Requirement { get; set; }
 
    public Reserve()
    {
        Signals = new List<Signal>();
        Requirement = new Requirement();
    }
}
Вот запрос:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE [dbo].[Reserve] (
    [ReserveId]     INT            IDENTITY (1, 1) NOT NULL,
    [RequirementId] INT            NOT NULL,
    [ReserveName]   NVARCHAR (MAX) NULL,
    CONSTRAINT [PK_Reserve] PRIMARY KEY CLUSTERED ([ReserveId] ASC),
    CONSTRAINT [FK_Reserve_Requirement_RequirementId] FOREIGN KEY ([RequirementId]) REFERENCES [dbo].[Requirement] ([RequirementId]) ON DELETE CASCADE
);
 
 
GO
CREATE NONCLUSTERED INDEX [IX_Reserve_RequirementId]
    ON [dbo].[Reserve]([RequirementId] ASC);
Ели честно, я уже написал обработчик, который ищет в таблице Signal сущности с ReserveId, равным удаляемому, и меняет его на null, после чего сохраняет контекст и удаляет сущность Reserve. Работает.

Что касается типа БД: а какие возможны варианты? Я слаб в этой области, знаю только реляционные)

Добавлено через 9 минут
Цитата Сообщение от HF Посмотреть сообщение
- где-то создалась рекурсия и умный EF это нашёл и не прописал в этой модели избыточную настройку.
Кстати, возможно, Вы правы, я пытался в запросе Signal в CONSTRAINT для FK_ReserveId вставить запись ON DELETE SET NULL, он начал ругаться вот так:

Introducing FOREIGN KEY constraint 'FK_Signal_Reserve_ReserveId' on table 'Signal' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
0
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,689
Записей в блоге: 2
22.09.2022, 11:53
Цитата Сообщение от Vanka03 Посмотреть сообщение
C#
1
2
[Required]
    public virtual ICollection<Signal> Signals { get; set; }
Что это такое? У коллекции не может быть такого атрибута. Это по сути даже бессмыслено.

Ну и вот ответ. Действительно зацикленность. Зачем вы везде ссылок друг на друга наставили.
А это помоему и есть главная ошибка.
C#
1
2
3
    [Key]
    [ForeignKey("Signal")] <---
    public int ReserveId { get; set; }
с чего бы ключу указывать такой атрибут. Почитайте как FK ключи в описываются. Для намёка - RequirementId же отдельный ключ на другую таблицу. И как раз у него такие атрибуты и ставят.
А в вашем атрибуте даже имя не существующее. Почему через nameof рекомендуют писать - чтобы существующие имена привязывать.
1
4 / 4 / 0
Регистрация: 01.11.2013
Сообщений: 216
22.09.2022, 14:13  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Зачем вы везде ссылок друг на друга наставили
Я думал, что это означает примерно "это поле является внешним ключем в таблице "Signal"". Я убрал все атрибуты из модели Reserve, не помогло. На всякий случай, код модели Reserve:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Reserve
{
    public int ReserveId { get; set; }
 
    public int RequirementId { get; set; }
 
    public string ReserveName{ get; set; }
 
    public virtual ICollection<Signal> Signals { get; set; }
 
    public Requirement Requirement { get; set; }
 
    public Reserve()
    {
        Signals = new List<Signal>();
        Requirement = new Requirement();
    }
}
Или Вы имели в виду что-то другое?
0
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,689
Записей в блоге: 2
22.09.2022, 18:12
Цитата Сообщение от Vanka03 Посмотреть сообщение
Я думал, что это означает примерно "это поле является внешним ключем в таблице "Signal""
А если у вас несколько таблиц ссылаются на эту таблицу? То по вашей логике - нужно добавить Х атрибутов с указанием "Это поле является внешним ключём в таблице ХХХ"
Эту задачу выполняет настоящий внешний ключ внешней таблицы.

А то что вы делаете - больше похоже на обратный ключ (InverseProperty). Но он всё равно не должен быть здесь. И настраивается он иначе. А вы или атрибутами настраивайте, или через fluent-api.

Цитата Сообщение от Vanka03 Посмотреть сообщение
Я убрал все атрибуты из модели Reserve, не помогло. На всякий случай, код модели Reserve
Скажу прямо. Вы пользуетесь сейчас "методом тыка". Есть простые документации по настройке модели с внешними связями. И с атрибутами и с флюэнт правилами.
И вы показываете кусок кода по которому не сделать выводы. Вся магия по миграции от нас скрыта. Или вы не используете вообще моделБилдер? Тогда с чего вы убрали атрибуты?

C#
1
public virtual ICollection<Signal> Signals { get; set; }
Это вообще чушь. Подтверждение того что вы непонятно откуда берёте информацию по настройке. "virtual" уже 100 лет не используют. А если сделали, то у вас не возникло мысли - почему остальные свойства без этого свойства? Короче говоря - не знаете зачем - не используйте.

Вообщем помочь не могу. Вы по капле выдаёте. Но видно что у вас какая-то ересь в настройке.
Ради интереса - удалите всё. Создайте две модели, с парой свойств и настройке зависимости. Когда настроите правильно - у вас будет и БД корректная. А пока намешано всего, то даже нет уверенности что сама БД нормально спроектирована.
1
4 / 4 / 0
Регистрация: 01.11.2013
Сообщений: 216
22.09.2022, 19:02  [ТС]
Дело в том, что у меня довольно большой Legacy-проект, сложно весь его выдать. Отсюда же и странности с настройкой БД =) Ладно, я попробую поэтапно во всем разобраться, в любом случае, спасибо за попытку помочь и советы!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.09.2022, 19:02
Помогаю со студенческими работами здесь

Добавление в таблицы объединенные внешним ключом
Пожалуйста, скажите, что не так???????

Ошибка #150 при создании таблицы с внешним ключом
Всем доброго времени суток, в чём проблема, уже битый час не могу понять, 1 таблица создаётся, но вот во второй ошибка #150, почему? Ведь...

Пытаюсь соединить таблицы внешним ключом - ввыдает ошибку
Я им соединение а они мне вот что: #1452 - Cannot add or update a child row: a foreign key constraint fails...

Не могу удалить запись из таблицы
Всем доброго времени суток. У меня почему то не удаляется пользователь из таблицы есть класс DAL в котором есть такой блок кода ...

Проблема с внешним ключом
Добрый день! Я работаю над своим проектом по спортивной аналитике. Решил перенести готовые таблицы csv в MySQL и связать их между...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
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
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru