Удаление связанных записей в 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", удалите дом и выведите, сколько
комнат осталось.