【问题标题】:How to map Oracle database NUMBER to c# bool type in .NET Core?如何将 Oracle 数据库 NUMBER 映射到 .NET Core 中的 c# bool 类型?
【发布时间】:2018-12-28 12:08:14
【问题描述】:

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

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

【问题讨论】:

标签: c# .net database oracle linq2db


【解决方案1】:

您需要在映射架构中配置 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 类型参数。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果您使用 Fluent API 配置模型,从 EF Core 2.1 开始,您可以使用 Value Conversions

      目前还没有 NumberToBool 的内置转换器,但可以这样写:

      var converter = new ValueConverter<bool, int>(
          v => v ? -1 : 0,
          v => (v == -1));
      
      entity.Property(e => e.IsNew)
          .HasColumnName("ISNEW")
          .HasConversion(converter);
      

      【讨论】:

        猜你喜欢
        • 2010-10-04
        • 2011-07-26
        • 2017-08-30
        • 2012-06-16
        • 2010-09-25
        • 1970-01-01
        • 2012-02-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多