c# - 使用 SQLite 删除的 Entity Framework Core ExecuteSqlCommand 不起作用
问题描述
我有以下模型:
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
条件时,它会删除 table 的内容。
我猜测由于键列是 aGuid
并且它存储为 a 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);
这些都没有帮助。
我该怎么办?
解决方案
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);
推荐阅读
- javascript - 每 24 小时生成随机字符串然后刷新 JavaScript?
- java - Java中的文字和变量如何进行数字提升和降级?
- php - 如何在 CodeIgniter 4 的 Autoload 文件中加载模型
- django - 在 django 中从私有 s3 提供静态文件
- python-3.x - discord.py embed.fields.2.value:此字段为必填项
- xaml - 在 CollectionView 的中心显示元素
- python - 4 个最后一个字符被截断的列
- powershell - 通过 Powershell 监控内存和 CPU
- blazor - Blazor WASM - 构建错误 - “静态 Web 资产具有冲突的 Web 根路径”
- angular - 如何从 Angular 中的 ASP.Net Core Web API 请求令牌