Einzelnen Beitrag anzeigen

Morphie

Registriert seit: 27. Apr 2008
Ort: Rahden
630 Beiträge
 
#1

Firebird UUID <> GUID

  Alt 16. Jan 2013, 18:53
Datenbank: Firebird • Version: 2.5.2 • Zugriff über: ADO.NET
Hi,

ich habe mich aus diversen Gründen dafür entschieden, die Primärschlüssel in meiner Datenbank als UUID abzubilden.
Die UUID-Domain ist (wie hier beschrieben) in Firebird wie folgt deklariert:
Code:
CREATE DOMAIN UUID AS
  CHAR(16)
  CHARACTER SET OCTETS;
Die Felder versehe ich mit folgendem Comment:
Code:
#GUID#
Ab sofort erkennt das EntityFramework die Felder als GUIDs und mappt diese entsprechend.
Die GUIDs vergebe ich im Constructor der Entities auf der Client-Seite.

Jetzt zum Problem:
Heute habe ich mehrere Stunden damit verbracht, herauszufinden, warum das EF meine Datensätze beim Refresh nicht wiederfindet.
Zuerst hatte ich den ADO.NET Provider in Verdacht, doch dann stelle sich heraus, dass der nicht schuld war. Er überträgt schon die richtigen Werte.

Das EntityFramework setzt beim Refresh-Befehl folgenden SQL-Query ab:
Code:
SELECT
"B"."ID" AS "ID",
"B"."BEZEICHNUNG" AS "BEZEICHNUNG"
FROM "ZAHLUNGSARTEN" AS "B"
WHERE "B"."ID" = CHAR_TO_UUID('a6ddceee-dc33-46cc-9378-75fbc4d87ef2')
Folgende GUID hat mein Objekt also als Primärschlüssel:
Code:
a6ddceee-dc33-46cc-9378-75fbc4d87ef2
oder in folgende 16 Codes ausgedrückt:
Code:
238,206,221,166,51,220,204,70,147,120,117,251,196,216,126,242
Stelle ich diese Bytes aber in Firebird mittels UUID_TO_CHAR dar, so wie es die SQL-Abfrage macht, bekomme ich eine andere Zeichenfolge, nämlich diese:
Code:
EECEDDA6-33DC-CC46-9378-75FBC4D87EF2
UUID_TO_CHAR bildet also einen falschen / anderen String ab. Dann ist es auch klar, warum das EntityFramework meine Datensätze nicht wiederfindet...

Jetzt die Frage:
Ist das ein Bug in Firebird?
Laut den Release-Notes hat sich in FB 2.5.2 etwas an dem Algorithmus geändert, doch das behebt mein Problem leider nicht.

Oder gibt es wirklich einen Unterschied zwischen UUID und GUID?
Gibt es eine UDF, um die richtige GUID-Zeichenfolge abbilenden zu können?

Oder wäre es vielleicht besser, doch den ADO.NET Firebird Provider umzuschreiben, so dass er nicht mehr UUID_TO_CHAR aufruft, sondern die GUID als Byte-Array per Paramater übergibt? Und wenn ja, wie geht das?!

Ich hoffe mir kann hier jemand helfen, falls jemand diese doch recht spezielle Frage überhaupt versteht
  Mit Zitat antworten Zitat