Есть ли способ включить "PRAGMA foreign_keys = true" из строки соединения в Mono.Data.Sqlite? - PullRequest
0 голосов
/ 18 октября 2019

Я использую 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 по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...