Как мне сопоставить обнуляемый столбец tinyint с логическим значением, при котором значение NULL становится ложным в EF Core? - PullRequest
0 голосов
/ 16 мая 2018

Я поддерживаю набор приложений для базы данных SqlServer, у которой нет простого процесса создания, и различные экземпляры в производстве имеют небольшие различия (в отношении обнуляемости столбцов и размеров varchar). Я перемещаю уровень данных этих приложений с EF 6 на EF Core 2.1, чтобы увеличить поддержку платформы и, наконец, получить простой способ создания новых баз данных с согласованной структурой.

Я мог бы воспользоваться этой возможностью, чтобы немного очистить свои POCO. Один из шаблонов, который я хотел бы устранить, заключается в том, что исходная база данных SqlServer часто использует tinyint null вместо bit столбцов с ограничением по умолчанию для них. Они сопоставлены с byte?, а не bool в моем коде C #, что, я думаю, излишне усложняет их использование. В дальнейшем я хотел бы, чтобы новые базы данных использовали вместо этого битовые поля, и во многих случаях целесообразно, чтобы они не были нулевыми и по умолчанию равнялись 0. У меня это работает, но я решил, что при всей гибкости EF Core, Я должен иметь возможность создавать подклассы для моего DbContext и предоставлять различные сопоставления, чтобы позволить тому же коду запускаться с исходными "устаревшими" базами данных, а там все равно вместо этого могут использоваться крошечные крошечные фрагменты.

Попытка 1 Я надеялся использовать ValueConverter<bool, byte?> в своем подклассе LegacyDbContext для выполнения этого (передавая его в PropertyBuilder<bool>.HasConversion), пока не узнал, что их нельзя использовать для преобразования нулей в разделе ограничений EF Core docs так что я получаю System.InvalidOperationException заявив: An exception occurred while reading a database value for property '<tableName>.<columnName>'. The expected type was 'System.Boolean' but the actual value was null.

Попытка 2 Регистрация пользовательской реализации Microsoft.EntityFrameworkCore.Metadata.Internal.IEntityMaterializerSource, чтобы позаботиться об этом преобразовании для меня, но я не смог заставить это работать, я думаю, что это слишком поздно для меня, чтобы выполнить преобразование типов ...

Конечно, можно заменить нули на 0 до преобразования типа из байта в bool или какой-то другой механизм для выполнения моих новых POCO, используя bools для отображения обратно в обнуляемые крошечные кусочки старых баз данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...