В C # у меня есть поле byte[]
с именем UniqueId. Я сохраняю это поле как двоичное (16) в базе данных SQL Server (EF6).
Я заметил, что иногда сохраненный guid составляет 15 байтов вместо 16 байтов. Это вызывает следующее исключение, когда я делаю var guid = new Guid(uniqueId)
после получения значения из БД:
System.ArgumentException: байтовый массив для GUID должен быть ровно 16
длина байта.
После изучения этого я заметил, что всякий раз, когда мой сгенерированный guid содержит "00" в конце гекса, SQL обрезает его!
Пример:
Сгенерированный Guid (через Guid.NewGuid): FF96F954777E8941A04774CD157C5C00 (16 байтов)
Сохраненный двоичный код (16) в SQL Server : 0xFF96F954777E8941A04774CD157C5C (15 байт)
Если вы заметили, 00
в конце усекается. В результате, если я сделаю запрос в этом поле и попытаюсь преобразовать его байты в Guid, я получу System.ArgumentException
.
Кто-нибудь еще испытывает эту проблему? Какой обходной путь? Я думаю об обёртке для Guid
, которая продолжает генерировать направляющие, пока у нее нет конечных нулей, но это кажется хакерским.
Обновление 1: так как вы, ребята, запросили это, я запустил средство профилирования SQL, и это SQL, сгенерированный EF (сокращенная версия):
exec sp_executesql N'INSERT [dbo].[customers]([UniqueId])
VALUES (@0)',N'@0 varbinary(max)',@0=0xFF96F954777E8941A04774CD157C5C00