Entity Framework Core ExecuteSqlCommand удалить с SQLite не работает - PullRequest
2 голосов
/ 15 апреля 2019

У меня есть следующая модель:

public class LogData
{
    public Guid ID { get; set; }
    public string Name { get; set; }
}

Я использую Entity Framework Core , чтобы сохранить эти модели в базе данных SQLite , она хорошо работает.

Мне нужно удалить из данных (это динамически, я не могу использовать объекты), поэтому я использую следующую команду:

string command="DELETE FROM LogData WHERE ID IN ('ea53b72a-4ab2-4f88-8f1d-0f96baa7cac7')";
context.Database.ExecuteSQLCommand(command);

В соответствии с синтаксисом SQLite , это действительно.

К сожалению, в результате я получаю 0, поэтому ни одна строка не была затронута.Когда я удаляю условие WHERE, удаляет содержимое таблицы .

У меня есть предположение, что в качестве ключевого столбца является Guid, и оно сохраняется как BLOB, простой движок SQLite не может его найти.

Поэтому я попытался изменить команду следующим образом:

string command="DELETE FROM LogData WHERE HEX(ID) IN ('ea53b72a-4ab2-4f88-8f1d-0f96baa7cac7')";
context.Database.ExecuteSqlCommand(command);

Также попробовал это:

string command="DELETE FROM AuditLog WHERE HEX(ID) = 'ea53b72a-4ab2-4f88-8f1d-0f96baa7cac7'";
context.Database.ExecuteSqlCommand(command);

Это тоже:

string command="DELETE FROM AuditLog WHERE ID = 'ea53b72a-4ab2-4f88-8f1d-0f96baa7cac7'";
context.Database.ExecuteSqlCommand(command);

Никто из них не помог.

Что мне делать с этим?

1 Ответ

2 голосов
/ 15 апреля 2019

Идентификаторы GUID хранятся в базе данных в виде двоичного файла BLOB, означающего, что вам необходимо передать двоичное значение для сравнения.Для этого вы используете обозначение X'...'.Кроме того, вам нужно преобразовать порядковый номер GUID в меньший порядковый номер.К счастью, есть удобный метод расширения здесь , чтобы сделать ваше преобразование:

public static Guid FlipEndian(this Guid guid)
{
    var newBytes = new byte[16];
    var oldBytes = guid.ToByteArray();

    for (var i = 8; i < 16; i++)
        newBytes[i] = oldBytes[i];

    newBytes[3] = oldBytes[0];
    newBytes[2] = oldBytes[1];
    newBytes[1] = oldBytes[2];
    newBytes[0] = oldBytes[3];
    newBytes[5] = oldBytes[4];
    newBytes[4] = oldBytes[5];
    newBytes[6] = oldBytes[7];
    newBytes[7] = oldBytes[6];

    return new Guid(newBytes);
}

И вы используете его так:

//The source GUID
var source = Guid.Parse("ea53b72a-4ab2-4f88-8f1d-0f96baa7cac7");
//Flip the endianness
var flippedGuid = source.FlipEndian();

//Create the SQL
var command = $"DELETE FROM AuditLog WHERE ID = X'{flippedGuid.ToString().Replace("-", "")}'";

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