Sebagai diamati oleh Alberto Ferrari
dan dibahas di sini di StackOverflow
, Microsoft SQL Server mengurutkan GUID dengan membandingkan byte dalam urutan tertentu. Karena MySQL akan mengurutkan BINARY(16)
"straight-foward", yang perlu kita lakukan, adalah menyusun ulang byte saat membaca/menulis ke database.
NHibernate memungkinkan kita untuk mendefinisikan tipe data kustom, yang dapat digunakan dalam pemetaan antara database dan objek. Saya telah menerapkan BinaryGuidType
, mampu menyusun ulang byte yang dihasilkan oleh Guid.ToByteArray()
menurut cara MSSQL mengurutkan GUID dan menyusunnya kembali ke format yang diterima oleh Guid(byte[])
konstruktor.
Urutan byte terlihat seperti ini:
int[] ByteOrder = new[] { 10,11,12,13,14,15,8,9,6,7,4,5,0,1,2,3 };
Menyimpan System.Guid
ke BINARY(16)
seperti ini:
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);
Membaca byte kembali menjadi System.Guid
seperti ini:
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];
}
Kode sumber lengkap untuk BinaryGuidType
di sini.
Ini tampaknya bekerja dengan baik. Membuat dan mempertahankan 10.000 objek baru dalam tabel, mereka disimpan sepenuhnya secara berurutan, tanpa tanda-tanda fragmentasi indeks.