Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
⊗csSpRlDel 434 of 509 menu
◀ ▶

Удаление связанных записей в C#

Если проверка FOREIGN KEY включена, удаление родителя завершится ошибкой, когда на него ещё ссылаются дочерние строки.

Один из способов - объявить ON DELETE CASCADE при создании таблицы. Тогда SQLite удалит дочерние строки вместе с родителем. Сначала печатают число удалённых складов, затем сколько ячеек осталось:

using Microsoft.Data.Sqlite; static void EnableForeignKeys(SqliteConnection connection) { using var pragma = connection.CreateCommand(); pragma.CommandText = "PRAGMA foreign_keys = ON"; pragma.ExecuteNonQuery(); } using var connection = new SqliteConnection("Data Source=cascade_bins.db"); connection.Open(); EnableForeignKeys(connection); using (var create = connection.CreateCommand()) { create.CommandText = "CREATE TABLE warehouses (id INTEGER PRIMARY KEY, code TEXT NOT NULL);" + "CREATE TABLE bins (id INTEGER PRIMARY KEY, warehouse_id INTEGER NOT NULL, " + "label TEXT NOT NULL, FOREIGN KEY (warehouse_id) REFERENCES warehouses (id) " + "ON DELETE CASCADE);" + "INSERT INTO warehouses (code) VALUES ('W1');" + "INSERT INTO bins (warehouse_id, label) VALUES (1, 'A-01');"; create.ExecuteNonQuery(); } using (var delete = connection.CreateCommand()) { delete.CommandText = "DELETE FROM warehouses WHERE id = 1"; Console.WriteLine(delete.ExecuteNonQuery()); // выведет 1 } using (var count = connection.CreateCommand()) { count.CommandText = "SELECT COUNT(*) FROM bins"; Console.WriteLine(count.ExecuteScalar()); // выведет 0 }

Создайте "site_rooms.db" с таблицами "buildings" и "rooms" так, чтобы удаление дома убирало его комнаты. Добавьте дом "Main" и комнаты "R-1" и "R-2", удалите дом и выведите, сколько комнат осталось.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить