Как сопоставить базу данных Oracle NUMBER с типом c # bool в .NET Core?

2

У меня есть таблица базы данных Oracle со столбцом типа NUMBER. Из-за устаревших причин этот столбец представляет логическое значение, так что значение 0 представляет значение false, а значение -1 представляет собой значение true.

Мне нужно сопоставить эту таблицу с классом С# и, таким образом, сопоставить этот столбец для свойства bool с указанными значениями сопоставления. Я использую linq2db в качестве ORM в приложениях .NET Core (консоли и asp.net). Есть ли способ сказать Oracle Managed Client (Oracle.ManagedDataAccess.Core) автоматически выполнять это сопоставление для всех запросов к базе данных, которые я выполняю из своего кода?

Теги:
database
linq2db

3 ответа

0
Лучший ответ

Вам необходимо настроить сопоставления между 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 как параметр типа/для типа.

1

Модель в сетевой библиотеке имеет классы. Вам нужно будет отредактировать или переопределить класс и добавить код ниже

    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; }
        }
    }
-1

Если вы используете 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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню