10

我将我们产品的数据库从另一个支持Guid的产品移植到SQLite。据我们所知,SQLite不支持Guid。我已经从我的数据库(数据库第一)创建了一个实体框架6模型,我需要从C#构建一个查询,将Guid与从代码传递的一个进行比较。SQLite实体框架6提供程序如何处理Guid?

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

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

+0

SQLite没有一个明确的列类型GUID,但它们存储类型亲和力'BLOB'工作完全正常。不太了解实体框架,但似乎类型转换器(超出枚举)将只在EF 7中。但GUID从字节数组等等,因此它可能是非常简单的。 – peterchen 2014-12-03 18:45:47

+0

我将它们作为BLOB存储在我的模型中,但是,我遇到了问题。该代码具有类似于“ID == Guid('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')的表达式,因为数据库中ID的类型是”Byte []“而引发异常,右侧是是一个'Guid',有问题的代码必须在我们的客户端(我正在使用的代码)上运行SQLite,并且在我们的服务器上,数据库是SQL Server的表达式字符串不能改变。在SQLite端做一些比较工作,我只是不知道是什么,这就是为什么我在寻找文档。 – 2014-12-03 18:54:13

+0

在SQLite中,你可以覆盖Guid()函数:https:// www。 sqlite.org/c3ref/create_function.html(不知道如何通过EF工作) – peterchen 2014-12-03 19:52:51

回答

3

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

我的问题是,SQLite实体框架6提供程序不能将代码中的文字Guid正确转换为SQL。即,形式

context.MyEntity.Where(x => x.GuidColumn == new Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")) 

获取转换成如下的SQL的一个LINQ表达式:

SELECT GuidColumn, Column1, Column2, . . . Column n 
FROM MyEntity AS Extent1 
WHERE Extent1.GuidColumn = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" 

这是错误的,由于存储在列中的值是一个字节数组。

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

+0

多数民众赞成在很糟糕....我们已决定将GUID作为字符串存储由于这个问题 – DarkWalker 2017-06-16 09:54:26

+0

虽然我不再在该公司,并且不再访问该代码库,我认为我们所做的是将Guid放入Guid变量和与之相比较。据我记忆,这是正确处理。 – 2017-06-21 19:13:01

10

看起来这是在1.0.95中解决的,然而在1.0.97中再次破坏了。解决的办法是设置在连接字符串为true BinaryGUID属性,并设置以下环境变量(你在建立连接之前)

Environment.SetEnvironmentVariable(“AppendManifestToken_SQLiteProviderManifest”,“BinaryGUID = TRUE;”);数据源= c:\ mydb.db;版本= 3; BinaryGUID = True;数据源= c:\ mydb.db;

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

+1

我使用的是1.0.97,但设置环境变量实际上为我打破了它。我得到'System.Data.Entity.Core.ProviderIncompatibleException:提供程序没有返回一个ProviderManifest实例.'和一个内部异常'System.ArgumentException:具有相同键的条目已经存在.'。但是只有改变连接字符串才能正常工作。 – Thorarin 2015-07-24 09:05:02

+1

Great Post!这为我解决了问题,使用1.0.99和实体框架6 – RichTurner 2016-01-26 14:21:47

+0

BinaryGUID =配置文件中的True是我需要做的。 – CrusherJoe 2016-09-26 08:39:22