SQLite Entity Framework 6提供程序如何处理Guids?

Ton*_*ile 13 c# sqlite entity-framework system.data.sqlite entity-framework-6

我将我们产品的数据库从另一个支持Guids的产品移植到SQLite.众所周知,SQLite不支持Guids.我已经从我的数据库(数据库优先)创建了一个实体框架6模型,我需要从C#构建一个查询,将Guid与从代码传递的Guid进行比较.

问题是我找不到任何关于SQLite实体框架提供程序如何处理Guids的文档.网络搜索也找不到对我有用的东西.关于在SQLite中使用Entity Framework的问题.

任何人都可以指向我的文档,或者告诉我如何通过EF6模型在SQLite数据库中使用Guids?

Gre*_*reg 11

似乎这在1.0.95中得到了解决,但在1.0.97再次被打破.解决方案是将连接字符串上的BinaryGUID属性设置为true并设置以下环境变量(在建立连接之前)

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

数据源= c:\ mydb.db;版本= 3; BinaryGUID = True;

https://www.connectionstrings.com/sqlite/

  • 我使用的是 1.0.97,但设置环境变量实际上对我来说破坏了它。我得到“System.Data.Entity.Core.ProviderIncompatibleException : The provider did not return a ProviderManifest instance.”和一个内部异常“System.ArgumentException : An entry with the same key already existing.”。但是,仅更改连接字符串就可以正常工作。 (2认同)

Ton*_*ile 4

这个问题我终于有了答案。

我的问题是 SQLite Entity Framework 6 提供程序无法正确处理将代码中的文字 Guid 转换为 SQL。即,以下形式的 Linq 表达式

context.MyEntity.Where( x => x.GuidColumn == new Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx") )
Run Code Online (Sandbox Code Playgroud)

转换为以下 SQL:

SELECT GuidColumn, Column1, Column2, . . . Column n
FROM MyEntity AS Extent1
WHERE Extent1.GuidColumn = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Run Code Online (Sandbox Code Playgroud)

这是错误的,因为存储在列中的值是字节数组。

根据SQLite 网站上的这个问题报告,事实证明 SQLite 团队认为这是提供程序中的一个错误,他们正在努力在 1.0.95.0 版本中修复它。我不知道什么时候会发布,但至少他们认识到这是一个问题并且会解决它。