10

Ich portiere die Produktdatenbank auf SQLite von einem anderen Produkt, das Guids unterstützt. Wie wir wissen, unterstützt SQLite keine Guids. Ich habe ein Entity Framework 6 Modell aus meiner Datenbank (Datenbank zuerst) erstellt und ich muss eine Abfrage von C# erstellen, die die Guid mit einer aus dem Code übergeben vergleicht.Wie behandelt der SQLite Entity Framework 6-Provider Guids?

Die Sache ist, ich kann keine Dokumentation darüber finden, wie der SQLite Entity Framework-Anbieter Guids behandelt. Eine Websuche hat auch nichts Nützliches für mich gefunden. Nur Fragen zur Verwendung von Entity Framework mit SQLite.

Kann mir jemand auf die Dokumentation verweisen oder mir vielleicht sagen, wie man mit Guids in einer SQLite-Datenbank über ein EF6-Modell arbeitet?

+0

SQLite keinen expliziten Spaltentyp GUID hat, aber sie mit Typ-Affinität 'BLOB' arbeitet völlig in Ordnung zu speichern. Ich weiß nicht viel über Entity Framework, aber es scheint, dass Typkonverter (abgesehen von Enums) nur in EF 7 sein werden. Aber GUID hat einen CTor von Bytearray usw., also könnte es ziemlich einfach sein. – peterchen

+0

Ich speichere sie als BLOBs in meinem Modell, aber ich habe ein Problem. Der Code hat einen Ausdruck ähnlich "ID == Guid ('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'), der eine Ausnahme auslöst, weil der Typ der ID in der Datenbank' Byte [] 'ist und das Ding auf der rechten Seite ist ein "Guid". Der fragliche Code muss auf unserem Client (der Code, an dem ich gerade arbeite) mit SQLite und auf unserem Server laufen, wo die Datenbank SQL Server ist. Der Ausdruck String kann nicht geändert werden. Ich habe etwas auf der SQLite-Seite zu tun, damit der Vergleich funktioniert Ich weiß nur nicht, was. Deshalb suche ich nach der Dokumentation. –

+0

In SQLite können Sie die Funktion Guid() überschreiben: https: // www. sqlite.org/c3ref/create_function.html – peterchen

Antwort

3

Ich habe endlich eine Antwort auf dieses Problem.

Mein Problem ist, dass der Provider SQLite Entity Framework 6 nicht die Konvertierung von Literal Guids in Ihrem Code in SQL ordnungsgemäß verarbeitet. Das heißt, ein Linq Ausdruck der Form

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

in die folgenden SQL umgewandelt erhält:

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

Das ist falsch, da der in der Spalte gespeicherten Wert ein Byte-Array ist.

Laut this problem report on the SQLite site stellt sich heraus, dass das SQLite-Team dies als einen Fehler im Anbieter betrachtet und sie arbeiten daran, es in Release 1.0.95.0 zu beheben. Ich weiß nicht, wann das veröffentlicht wird, aber zumindest erkennen sie es als ein Problem und werden es beheben.

+0

Das ist schlecht .... wir haben beschlossen, GUIDs als Strings aufgrund dieses Problems zu speichern – DarkWalker

+0

Während ich nicht mehr bei dieser Firma bin und keinen Zugang mehr zu dieser Codebasis habe, denke ich, was wir getan haben, war das Guid in ein Guid Variable & verglichen dagegen. Soweit ich mich erinnere, wird dies korrekt gehandhabt. –

10

Es scheint, dass dies in 1.0.95 gelöst wurde, aber in 1.0.97 wieder gebrochen. Die Lösung besteht darin, die BinaryGUID-Eigenschaft für die Verbindungszeichenfolge auf true festzulegen und die folgende Umgebungsvariable festzulegen (bevor Sie die Verbindung herstellen)

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

Datenquelle = c: \ mydb.db; Version = 3; BinaryGUID = True;

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

+1

Ich benutze 1.0.97, aber das Setzen der Umgebungsvariable bricht es tatsächlich für mich. Ich bekomme 'System.Data.Entity.Core.ProviderIncompatibleException: Der Provider hat keine ProviderManifest-Instanz zurückgegeben.' und eine innere Ausnahme' System.ArgumentException: Ein Eintrag mit demselben Schlüssel existiert bereits.' Nur das Ändern der Verbindungszeichenfolge funktioniert jedoch gut. – Thorarin

+1

Toller Beitrag! Dies behebt das Problem für mich mit 1.0.99 und Entity Framework 6 – RichTurner

+0

BinaryGUID = True in der Konfigurationsdatei ist alles, was ich tun musste. – CrusherJoe

Verwandte Themen