gpt4 book ai didi

sqlite - 如何使用GUID作为System.Data.Sqlite的主键

转载 作者:行者123 更新时间:2023-12-03 17:52:35 25 4
gpt4 key购买 nike

我并不是说这是明智的,但有时您会继承一些只需要工作的东西。在这种情况下,它是主键指南...

开箱即用,您会收到有关System.Guid无法与byte [](如果使用BinaryGUID = False,则为String)一起使用的错误。

最佳答案

要解决此问题,您需要拦截byte []数组(或字符串),并返回Guid类型。使用System.Data.Sqlite提供程序可以做到这一点。

第一

using System.Data.SQLite;


然后,将其放入代码优先的数据库上下文的构造函数中:

var con = (SQLiteConnection)base.Database.Connection;
var bind = System.Data.SQLite.SQLiteTypeCallbacks.Create(
null,
new SQLiteReadValueCallback(GuidInterceptor), null, null);
con.SetTypeCallbacks("uniqueidentifier", bind);
con.SetTypeCallbacks("", bind); //Sometimes, the system just doesn't know
con.Flags |= SQLiteConnectionFlags.UseConnectionReadValueCallbacks;


然后这就是魔术函数:

    private void GuidInterceptor(SQLiteConvert convert, SQLiteDataReader reader, SQLiteConnectionFlags flags, SQLiteReadEventArgs args, string typename, int index, object userdata, out bool complete)
{
complete = false;
if (typename == "uniqueidentifier")
{
var e = (SQLiteReadValueEventArgs)args;

var o = reader.GetGuid(index);
e.Value.Value = o;
e.Value.GuidValue = o;
complete = true;
}
else
{
var o = reader.GetValue(index);
if (o is byte[])
{
var b = (byte[])o;
if (b.Length == 16)
{
var e = (SQLiteReadValueEventArgs)args;
var g = new Guid(b);
e.Value.Value = g;
e.Value.GuidValue = g;
complete = true;
}
}
else if (o is string)
{
var s = (string)o;
if (s.Length == 36)
{
var e = (SQLiteReadValueEventArgs)args;
var goGuid = (e.MethodName == "GetGuid");
if (!goGuid)
goGuid = (s[8] == '-' && s[13] == '-' && s[18] == '-' && s[23] == '-');

Guid g;
if (goGuid && Guid.TryParse(s, out g))
{
e.Value.Value = g;
e.Value.GuidValue = g;
complete = true;
}
else
{

}

}
}
}

}


那只能解决读入数据的问题。如果您尝试对Guid成员使用 .Where(),并且您正在使用 BinaryGUID=True,则不会返回任何行(应有的时候)。现在,您需要 BinaryGUID=False,它确实占用了更多空间,但这是一个简单的解决方案。

如果可以帮助,请尝试将Guid属性定义为:

[Key]
[MaxLength(16)]
[MinLength(16)]
public byte[] AccountUserId { get; set; }


您将不得不在应用程序层中调用 guidValue.ToByteArray()。您不必为该函数调用就可以创建一些帮助器。拥有自己的用于创建和解析Guid的自定义功能代理可能会有所帮助,因此您可以轻松更改实现。

就我而言,我没有足够的时间将所有Guid属性和用法转换为 byte[]

关于sqlite - 如何使用GUID作为System.Data.Sqlite的主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40003272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com