Как поставщик SQLite Entity Framework 6 обрабатывает Гиды?

Я переношу нашу базу данных продукта в SQLite из другого продукта, который поддерживает гиды. Как известно, SQLite не поддерживает Guids. Я создал модель сущности framework 6 из моей базы данных (сначала база данных), и мне нужно построить запрос из С#, который сравнивает Guid с переданным из кода.

Дело в том, что я не могу найти документацию о том, как SQLite Entity Framework обрабатывает Гиды. Веб-поиск не нашел ничего полезного для меня. Просто вопросы об использовании Entity Framework с SQLite.

Может кто-нибудь указать мне на документацию или, может быть, расскажите, как работать с гидами в базе данных SQLite с помощью модели EF6?

Ответ 1

Наконец-то я получил ответ на эту проблему.

Моя проблема заключается в том, что поставщик SQLite Entity Framework 6 не обрабатывает правильное преобразование литеральных гидов в ваш код в SQL. То есть выражение Linq формы

context.MyEntity.Where( x => x.GuidColumn == new Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx") )

Получает преобразование в следующий SQL:

SELECT GuidColumn, Column1, Column2, . . . Column n
FROM MyEntity AS Extent1
WHERE Extent1.GuidColumn = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Это неверно, поскольку значение, хранящееся в столбце, является байтовым массивом.

Согласно этот отчет о проблеме на сайте SQLite, выясняется, что команда SQLite считает это ошибкой в ​​провайдере, и они работают над исправлением в выпуске 1.0.95.0. Я не знаю, когда это будет выпущено, но, по крайней мере, они признают это проблемой и исправят его.

Ответ 2

Похоже, что это было разрешено в 1.0.95, однако снова сломано в 1.0.97. Решение состоит в том, чтобы установить для свойства BinaryGUID строку подключения значение true и задать следующую переменную среды (до того, как вы установили соединение)

Environment.SetEnvironmentVariable( "AppendManifestToken_SQLiteProviderManifest", "; BinaryGUID = True;" );

Источник данных = c:\mydb.db; Версия = 3; BinaryGUID = True;

https://www.connectionstrings.com/sqlite/