如何将 Oracle 数据库 NUMBER 映射到 .NET Core 中的 c# bool 类型



我有 Oracle 数据库表,列类型为 NUMBER。由于遗留原因,此列表示布尔值,因此值 0 表示假,值 -1 表示真。

我需要将此表映射到 C# 类,从而将此列映射到具有指定映射值的 bool 属性。我在.NET Core应用程序(控制台和 asp.net)中使用linq2db作为ORM。有没有办法告诉Oracle托管客户端(Oracle.ManagedDataAccess.Core)自动对我从代码中执行的所有数据库查询执行此映射?

如果使用 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);
您需要

在映射架构中配置 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 作为 from/to 类型参数。

Net 库中的模型有类。 您需要编辑或覆盖该类并在下面添加代码

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

最新更新