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:
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