Я поддерживаю набор приложений для базы данных 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 для отображения обратно в обнуляемые крошечные кусочки старых баз данных?