1

PostgresからMySQLに移植しているアプリケーションがあります。理由は気にしないでください。アプリケーションはEntityFramework4を使用してデータベースにクエリを実行します。

さまざまな理由から、GuidsC#コードで使用し、データベースに保存してから、保存されたの値に基づいてデータをクエリする必要がありますGuids。私はMySQLと、本質的にブロブであるものをMySQLがどのように処理するかについてあまり詳しくありません。

まず、MySQLにはUUIDタイプがありません。それらをBINARY(16)値として保存する必要があります。いいよ。列をBINARY(16)として作成し、データをテーブルに書き込みます。良い。

私の問題は、Guidの保存された値と一致することがわからないことです。Guidテーブルに既知のデータを書き込んでからそれを取得しようとする単体テストを作成しました。データは正常にデータベースに送られますが、読み戻そうとすると行が表示されません。

次に、テーブルスキーマのサンプルを示します。

CREATE TABLE `MyDatabase`.`MyTable` (
    `id`                INT             NOT NULL AUTO_INCREMENT,
    `guid`              BINARY(16)      NOT NULL,
    `applicationId`     INT(11)         NOT NULL,
    `name`              VARCHAR(256)    NOT NULL,
    Description         VARCHAR(256)    NULL,
    SessionTimeout      INT             NOT NULL,
    DomainId            INT             NOT NULL,
    PRIMARY KEY (`id`),
    CONSTRAINT IX_aspnetx_groups UNIQUE ( `applicationId`, `id` )
);

EntityFrameworkのコードは次のとおりです。

var g = ( from r in context.MyTable
          where r.guid = id
          select r ).Single();

EntityFrameworkによって生成されるクエリは次のとおりです。

SELECT
`Extent1`.`id`, 
`Extent1`.`guid`, 
`Extent1`.`applicationId`, 
`Extent1`.`name`, 
`Extent1`.`Description`, 
`Extent1`.`SessionTimeout`, 
`Extent1`.`DomainId`
FROM `aspnetx_groups` AS `Extent1`
WHERE `Extent1`.`guid` = '81d7de5e-4212-4ff8-b3d4-9f115261971d' LIMIT 2;

これを実行すると、行が返されないため、C#コードで「シーケンスに要素が含まれていません」という例外がスローされます。

これを機能させるにはどうすればよいですか?

4

3 に答える 3

1

SELECTのWHERE句では、BINARY(16)(equalsの左側のGUID)を右側の文字列リテラルと比較しているように見えます。

有効な比較を実行するには、その文字列リテラルをBINARY(16)に変換してから、それをguidと比較します。

したがって、すべてのダッシュ文字を削除してからUNHEX関数を使用すると、次のようなトリックが実行されます。

WHERE `Extent1`.`guid` = 
  UNHEX(REPLACE('81d7de5e-4212-4ff8-b3d4-9f115261971d','-',''))

パフォーマンスを向上させるために、クエリで左側の裸のguid列を参照し(それと同じように)、どのような種類の関数でもguid列をラップしないようにする必要があります。述語のリテラル側で変換を実行する必要があるため、テーブルの各行に対して変換を実行するのではなく、クエリの開始時に1回だけ変換を実行する必要があります。

于 2012-08-09T20:36:07.670 に答える
1

私が抱えていた問題は、MySQL Connector/NetパッケージのEntityFrameworkコネクタの癖に関係していたことがわかりました。データベースでBINARY(16)のデータ型として使用している場合は、追加する必要のある接続文字列設定があります。Guids

Old Guids=True

これを接続文字列に追加すると、Entity Frameworkは、GUIDの挿入、更新、または比較時に実際に機能するコードを出力し始めます。

また、MySQLでのUUID / Guidのサポートは中途半端であり、使用可能な状態にするためにいくつかの深刻な作業が必要であるという結論に達しました。

于 2012-08-13T20:38:43.210 に答える
0

Tonyの答えに加えて、私は古いGUIDを使用してきましたが、今日までEFはGUIDを正しく変換していないようです。

どういうわけかそれは間違ったGUIDを解析するので、コードレベルでこれらの値を比較するときに異なるGUIDを使用する必要があります

于 2021-12-17T03:37:20.673 に答える