Я использую Mono.Data.Sqlite и Mono.Data.SqliteClient в качестве плагинов для Unity для управления соединением с базой данных SQLite в Unity 3D.
Я знаю по документации SQLite , чтоforeignkey отключен по умолчанию и должен быть включен для каждого соединения.
Чтение этот ответ для тех, кто использует System.Data.SQLite, представляется возможным включить первичные ключи при соединениистрока. Но это не работает на Mono.Data.Sqlite.
new SqliteConnection($"Data Source = {this.databasePath}; PRAGMA foreign_keys = true;"); //not working
Но, если я добавлю команду "PRAGMA foreign_keys = true;"до того, как мои Inserts / Updates / Deletes, он работает как положено, и FK становятся включенными.
using (var command = connection.CreateCommand())
{
command.CommandText = "PRAGMA foreign_keys = true; INSERT INTO Character ... "; //works!
}
Но я хотел бы включить FK при моем строковом соединении, чтобы некоторые программисты забыли запустить команду PRAGMA внекоторый код SQL.
Можно сделать как System.Data.Sqlite, но в Mono.Data.Sqlite?
=======================================
[РЕДАКТИРОВАТЬ] ВРЕМЕННОЕ РЕШЕНИЕ:
Пока что, поскольку SqliteConnection и SqliteCommand из Mono.Data.Sqlite являются запечатанными классами, я создал метод расширения с помощью трюка, чтобы принудительно выполнить PRAGMA перед командой sql, добавив новый метод, вызываемый SqliteCommand. :
using Mono.Data.Sqlite;
public static class CustomSqliteCommand
{
public static int ExecuteNonQueryWithFK(this SqliteCommand cmd)
{
var tmp = cmd.CommandText;
cmd.CommandText = $"PRAGMA foreign_keys = true; {tmp}";
return cmd.ExecuteNonQuery();
}
}
И использование выглядит следующим образом:
protected void InsertData()
{
var commandText = "INSERT INTO MyTable VALUES (@param1, @param2);";
using (var connection = Connection)
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = commandText;
command.Parameters.AddWithValue("@param1", someVar1);
command.Parameters.AddWithValue("@param2", someVar2);
var result = command.ExecuteNonQueryWithFK();
}
}
}
Протестировано и работает в качестве обходного пути до перекомпиляции библиотек sqlite или sqlite, которые однажды будут распространяться с FK по умолчанию.