У меня есть таблица базы данных Oracle со столбцом типа NUMBER. Из-за устаревших причин этот столбец представляет логическое значение, так что значение 0 представляет значение false, а значение -1 представляет собой значение true.
Мне нужно сопоставить эту таблицу с классом С# и, таким образом, сопоставить этот столбец для свойства bool с указанными значениями сопоставления. Я использую linq2db в качестве ORM в приложениях .NET Core (консоли и asp.net). Есть ли способ сказать Oracle Managed Client (Oracle.ManagedDataAccess.Core) автоматически выполнять это сопоставление для всех запросов к базе данных, которые я выполняю из своего кода?
Вам необходимо настроить сопоставления между System.boolean и типом "число" в вашей схеме сопоставления
// converter to query parameter
ms.SetConverter<bool, DataParameter>(val => new DataParameter { Value = <convert to number> });
// converter to query literal
ms.SetValueToSqlConverter(typeof(bool), (sb,tp,v) =>
{
if (v is bool val) sb.Append(<number literal>);
else sb.Append("NULL");
});
// converter from db value to boolean
ms.SetConverter<int, bool>(val => val != 0);
Также, возможно, вы захотите настроить его только для столбцов, помеченных как "число" DbType, поэтому используйте перегрузки конфигурации, которые принимают dbtype как параметр типа/для типа.
Модель в сетевой библиотеке имеет классы. Вам нужно будет отредактировать или переопределить класс и добавить код ниже
public class MyTable
{
private Boolean myBool { get; set; }
public int OracleNumber
{
get { return (myBool == false) ? 0 : -1; }
set { myBool = (value == -1) ? myBool = true : myBool = false; }
}
}
Если вы используете Fluent API для настройки своих моделей, начиная с EF Core 2.1 и далее, вы можете использовать преобразование значений.
В настоящее время нет встроенного конвертера для NumberToBool, но его можно записать так:
var converter = new ValueConverter<bool, int>(
v => v ? -1 : 0,
v => (v == -1));
entity.Property(e => e.IsNew)
.HasColumnName("ISNEW")
.HasConversion(converter);