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