としてアルベルトフェラーリによる観察
およびBINARY(16)
をソートするので 「ストレートフォワード」は、データベースの読み取り/書き込み時にバイトを並べ替えるだけです。
NHibernateを使用すると、データベースとオブジェクト間のマッピングで使用できるカスタムデータ型を定義できます。 BinaryGuidType
を実装しました 、Guid.ToByteArray()
MSSQLがGUIDを並べ替えて、で受け入れられる形式に並べ替える方法に従って、 Guid(byte[])
コンストラクター。
バイトオーダーは次のようになります:
int[] ByteOrder = new[] { 10,11,12,13,14,15,8,9,6,7,4,5,0,1,2,3 };
System.Guid
を保存する BINARY(16)
に このようになります:
var bytes = ((Guid) value).ToByteArray();
var reorderedBytes = new byte[16];
for (var i = 0; i < 16; i++)
{
reorderedBytes[i] = bytes[ByteOrder[i]];
}
NHibernateUtil.Binary.NullSafeSet(cmd, reorderedBytes, index);
バイトをSystem.Guid
に読み戻します このようになります:
var bytes = (byte[]) NHibernateUtil.Binary.NullSafeGet(rs, names[0]);
if (bytes == null || bytes.Length == 0) return null;
var reorderedBytes = new byte[16];
for (var i = 0 ; i < 16; i++)
{
reorderedBytes[ByteOrder[i]] = bytes[i];
}
これはうまくいくようです。テーブルに10.000個の新しいオブジェクトを作成して永続化すると、インデックスの断片化の兆候がなく、完全に順番に保存されます。