Ho il seguente modello:
public class LogData
{
public Guid ID { get; set; }
public string Name { get; set; }
}
Uso Entity Framework Core per salvare quei modelli in un database SQLite , funziona bene.
Devo cancellare dai dati (è dinamico, non posso usare oggetti), quindi uso il seguente comando:
string command="DELETE FROM LogData WHERE ID IN ('ea53b72a-4ab2-4f88-8f1d-0f96baa7cac7')";
context.Database.ExecuteSQLCommand(command);
Secondo la sintassi di SQLite, è valido.
Sfortunatamente, di conseguenza torno a 0, quindi nessuna riga è stata interessata. Quando rimuovo la condizione WHERE
, elimina il contenuto della tabella .
Immagino che, poiché la colonna chiave è una Guid
ed è memorizzata come BLOB
, il semplice motore SQLite non riesce a trovarla.
Quindi ho provato a modificare il comando a questo:
string command="DELETE FROM LogData WHERE HEX(ID) IN ('ea53b72a-4ab2-4f88-8f1d-0f96baa7cac7')";
context.Database.ExecuteSqlCommand(command);
Ho anche provato questo:
string command="DELETE FROM AuditLog WHERE HEX(ID) = 'ea53b72a-4ab2-4f88-8f1d-0f96baa7cac7'";
context.Database.ExecuteSqlCommand(command);
Anche questo:
string command="DELETE FROM AuditLog WHERE ID = 'ea53b72a-4ab2-4f88-8f1d-0f96baa7cac7'";
context.Database.ExecuteSqlCommand(command);
Nessuno di questi ha aiutato.
Cosa dovrei fare al riguardo?
I GUID vengono archiviati nel database come BLOB
binario, il che significa che è necessario passare un valore binario per il confronto. Per fare questo usi la notazione X'...'
. Inoltre, è necessario convertire l' endianness del GUID in little endian. Per fortuna, c'è un metodo di estensione a portata di mano qui per fare la vostra conversione:
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);
}
E lo usi in questo modo:
//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);