如何将 Oracle 数据库 NUMBER 映射到 .NET Core 中的 c# bool 类型?
How to map Oracle database NUMBER to c# bool type in .NET Core?
我的 Oracle 数据库 table 的列类型为 NUMBER。由于遗留原因,此列表示布尔值,因此值 0 表示 false,值 -1 表示 true。
我需要将此 table 映射到 C# class,从而将此列映射到具有指定映射值的 bool 属性。我在 .NET Core 应用程序(控制台和 asp.net)中使用 linq2db 作为 ORM。有没有办法告诉 Oracle Managed Client (Oracle.ManagedDataAccess.Core) 自动为我从我的代码执行的所有数据库查询执行此映射?
Net库中的模型有class个。您需要编辑或覆盖 class 并在下面添加代码
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; }
}
}
您需要在映射架构中配置 System.boolean 和 "number" 类型之间的映射
// 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);
您也可能只想为标有 "number" DbType 的列配置它,因此使用配置重载,将 dbtype 作为 from/to 类型参数。
如果您使用 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);
我的 Oracle 数据库 table 的列类型为 NUMBER。由于遗留原因,此列表示布尔值,因此值 0 表示 false,值 -1 表示 true。
我需要将此 table 映射到 C# class,从而将此列映射到具有指定映射值的 bool 属性。我在 .NET Core 应用程序(控制台和 asp.net)中使用 linq2db 作为 ORM。有没有办法告诉 Oracle Managed Client (Oracle.ManagedDataAccess.Core) 自动为我从我的代码执行的所有数据库查询执行此映射?
Net库中的模型有class个。您需要编辑或覆盖 class 并在下面添加代码
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; }
}
}
您需要在映射架构中配置 System.boolean 和 "number" 类型之间的映射
// 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);
您也可能只想为标有 "number" DbType 的列配置它,因此使用配置重载,将 dbtype 作为 from/to 类型参数。
如果您使用 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);