Как сопоставить базу данных Oracle NUMBER с типом c # bool в .NET Core? - PullRequest
0 голосов
/ 28 декабря 2018

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

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

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

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

0 голосов
/ 21 марта 2019

Если вы используете 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);
0 голосов
/ 28 декабря 2018

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

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