System.Data.Sqlite 1.0.99 引导比较不起作用

Posted

技术标签:

【中文标题】System.Data.Sqlite 1.0.99 引导比较不起作用【英文标题】:System.Data.Sqlite 1.0.99 guid comparison doesn't work 【发布时间】:2016-05-04 05:45:25 【问题描述】:

我正在使用 C# 中的 System.Data.Sqlite 1.0.99,您可以使用它调用 EF 的 db。我在通过Guid 选择FirstOrDefault 时遇到了这个问题,它返回null(但是数据库中存在具有这种guid 的行):

var user = context.Users.FirstOrDefault(x => x.Id == userId); //returns null
//or
var user = context.Users.Where(x => x.Id == userId).ToArray(); //returns empty array

发现一些信息表明这是已知问题并在 1.0.95 中修复,但在 1.0.97 和接下来的两个解决方案中再次损坏:

解决方案 1:将连接字符串上的 BinaryGUID 属性设置为 true:

Data Source=...;BinaryGUID=True;

解决方案 2:设置下一个环境变量(在建立连接之前):

   Environment.SetEnvironmentVariable("AppendManifestToken_SQLiteProviderManifest", ";BinaryGUID=True;");

解决方案 2 有效,因为(来自 sqlite 网站):

AppendManifestToken_SQLiteProviderManifest - 如果此环境变量设置为 [任何内容],System.Data.SQLite.Linq.SQLiteProviderManifest 类(以及 System. Data.SQLite.EF6.SQLiteProviderManifest 类)通过将环境变量的值附加到现有的提供者清单标记(如果有)来修改未来的提供者清单标记。通常,为了使构造的提供者清单标记在语法上正确,[待附加] 环境变量值必须以分号开头。

解决方案 1 对我不起作用,因为据我了解,它仅对 System.Data.SQLite.Linq.SQLiteProviderManifest 有影响。

问题:是否有任何解决方案可以解决此问题而不是设置环境变量?

【问题讨论】:

我确认这仍然是 System.Data.SQLite v1.0.104.0 的问题。解决方案 1 不起作用,解决方案 2 起作用。在我的 Entity 对象的部分类的构造函数中添加这一行确实有效,谢谢!如果您确实找到了其他解决方案,请发布,但现在已经足够了。 我很高兴我的问题/解决方案很有帮助。感谢您的回复! 【参考方案1】:

您会尝试使用 SingleorDefault 代替 FirstorDefault 吗? LINQ: When to use SingleOrDefault vs. FirstOrDefault() with filtering criteria

示例:var user = context.Users.SingleorDefault(x => x.Id == userId);

【讨论】:

以上是关于System.Data.Sqlite 1.0.99 引导比较不起作用的主要内容,如果未能解决你的问题,请参考以下文章

C# 引入Sqlite 未能加载文件或程序集“System.Data.SQLite

System.Data.SQLite数据库简介

使用 System.Data.SQLite 和 C# 检索 BLOB

未能加载文件或程序集“System.Data.SQLite”

System.Data.SQLite 参数未被替换

使用 System.Data.SQLite (C#) 的 SQLite 查询比在 SQLiteStudio 中要慢得多