Updated 类型映射 (markdown)

2881099
2024-08-19 15:12:12 +08:00
parent 228ffd4c30
commit abdaf40eee

@@ -1,18 +1,96 @@
## 自定义类型映射(MapType)
## 类型映射(默认)
### v3.2.701 版本自定义类型转换
> 提示:因排版问题,不显示所有支持的数据库
| csharp | MySql | SqlServer | PostgreSQL | Oracle | Sqlite | 达梦 |
| --------------------------------- | -------------------- | ---------------- | ------------- | --------------------------------- | ------------- | -------------- |
| bool \| bool? | bit(1) | bit | bool | number(1) | boolean | number(1) |
| sbyte \| sbyte? | tinyint(3) | smallint | int2 | number(4) | smallint | number(4) |
| short \| short? | smallint(6) | smallint | int2 | number(6) | smallint | number(6) |
| int \| int? | int(11) | int | int4 | number(11) | integer | number(11) |
| long \| long? | bigint(20) | bigint | int8 | number(21) | integer | number(21) |
| byte \| byte? | tinyint(3) unsigned | tinyint | int2 | number(3) | int2 | number(3) |
| ushort \| ushort? | smallint(5) unsigned | int | int4 | number(5) | unsigned | number(5) |
| uint \| uint? | int(10) unsigned | bigint | int8 | number(10) | decimal(10,0) | number(10) |
| ulong \| ulong? | bigint(20) unsigned | decimal(20,0) | numeric(20,0) | number(20) | decimal(21,0) | number(20) |
| double \| double? | double | float | float8 | float(126) | double | double |
| float \| float? | float | real | float4 | float(63) | float | real |
| decimal \| decimal? | decimal(10,2) | decimal(10,2) | numeric(10,2) | number(10,2) | decimal(10,2) | number(10,2) |
| Guid \| Guid? | char(36) | uniqueidentifier | uuid | char(36 CHAR) | character(36) | char(36) |
| TimeSpan \| TimeSpan? | time | time | time | interval day(2) to second(6) | bigint | - |
| DateTime \| DateTime? | datetime | datetime | timestamp | timestamp(6) | datetime | timestamp(6) |
| DateTimeOffset \| DateTimeOffset? | - | datetimeoffset | - | timestamp(6) with local time zone | - | timestamp(6) |
| Enum \| Enum? | enum | int | int4 | number(16) | mediumint | number(16) |
| FlagsEnum \| FlagsEnum? | set | bigint | int8 | number(32) | bigint | number(32) |
| byte[] | varbinary(255) | varbinary(255) | bytea | blob | blob | blob |
| string | varchar(255) | nvarchar(255) | varchar(255) | nvarchar2(255) | nvarchar(255) | nvarchar2(255) |
> string 指定长度 [Column(DbType = "varchar(max)")] 或者 [MaxLength(-1)] 或者 [Column(StringLength = -1)],当长度 -1 时产生的映射如下:
| MySql | PostgreSQL | SqlServer | Oracle | Sqlite | Firebird | DuckDB | MsAccess | 达梦 | 金仓 |
| ----- | ---------- | ------------ | ------ | ------ | --------------- | -------- | -------- | ---- | ---- |
| text | text | varchar(max) | nclob | text | blob sub_type 1 | text | longtext | text | text |
> 注意MySql [MaxLength(-2)] 或者 [Column(StringLength = -2)] 映射类型 longtext
> decimal 指定长度 [Column(Precision = 10, Scale = 2)]
## MapType
使用 MapType 枚举 -> string/int 等等如下:
```csharp
class Table
{
public int id { get; set; }
[Column(MapType = typeof(string))]
public PeopleType t1 { get; set; }
[Column(MapType = typeof(int))]
public PeopleType t2 { get; set; }
[Column(MapType = typeof(string))]
public BigInteger t3 { get; set; }
}
public enum PeopleType { 中国人, abc, 香港 }
```
## Json
> dotnet add package FreeSql.Extensions.JsonMap
```csharp
fsql.UseJsonMap(); //开启功能
class Table
{
public int Id { get; set; }
[JsonMap, Column(DbType = "json")]
public TableOptions Options { get; set; }
}
class TableOptions
{
public int Value1 { get; set; }
public string Value2 { get; set; }
}
fsql.Select<Table>().Where(a => a.Options.Value1 == 100 && a.Options.Value2 == "xx").ToList();
//WHERE json_extract(a."Options",'$.Value1') = 100 AND json_extract(a."Options",'$.Value2') = 'xx'
```
## TypeHandlers自定义
```csharp
FreeSql.Internal.Utils.TypeHandlers.TryAdd(typeof(JsonClass), new String_JsonClass());
class Product
{
public Guid id { get; set; }
[Column(MapType = typeof(string), StringLength = -1)]
public JsonClass json { get; set; }
}
class JsonClass
{
public int a { get; set; }
@@ -49,142 +127,55 @@ class DateTimeOffsetTypeHandler : TypeHandler<DateTimeOffset>
}
```
### 使用 MapType 枚举 -> string/int 等等如下:
## 类型映射(特别)
```csharp
class EnumTestMap {
public Guid id { get; set; }
FreeSql.Provider.MySql/MySqlConnector
[Column(MapType = typeof(string))]
public ToStringMapEnum enum_to_string { get; set; }
[Column(MapType = typeof(string))]
public ToStringMapEnum? enumnullable_to_string { get; set; }
[Column(MapType = typeof(int))]
public ToStringMapEnum enum_to_int { get; set; }
[Column(MapType = typeof(int?))]
public ToStringMapEnum? enumnullable_to_int { get; set; }
[Column(MapType = typeof(string))]
public BigInteger biginteger_to_string { get; set; }
[Column(MapType = typeof(string))]
public BigInteger? bigintegernullable_to_string { get; set; }
}
public enum ToStringMapEnum { 中国人, abc, 香港 }
```
应该不需要解释了吧?
BigInteger 都可以映射使用了,但请注意:仅仅是 CURD 方便, Equals == 判断可以使用,无法实现 + - * / 等操作;
v0.9.15 版本还可以将值对象映射成 typeof(string),安装扩展包:
> dotnet add package FreeSql.Extensions.JsonMap
```csharp
fsql.UseJsonMap(); //开启功能
class TestConfig {
public int clicks { get; set; }
public string title { get; set; }
}
[Table(Name = "sysconfig")]
public class S_SysConfig {
[Column(IsPrimary = true)]
public string Name { get; set; }
[JsonMap]
public TestConfig Config { get; set; }
}
```
## 默认类型映射
| csharp | MySql | SqlServer | PostgreSQL | Oracle | Sqlite | 达梦 |
| - | - | - | - | - | - | - |
| bool \| bool? | bit(1) | bit | bool | number(1) | boolean | number(1) |
| sbyte \| sbyte? | tinyint(3) | smallint | int2 | number(4) | smallint | number(4) |
| short \| short? | smallint(6) | smallint | int2 | number(6) | smallint | number(6) |
| int \| int? | int(11) | int | int4 | number(11) | integer | number(11) |
| long \| long? | bigint(20) | bigint | int8 | number(21) | integer | number(21) |
| byte \| byte? | tinyint(3) unsigned | tinyint | int2 | number(3) | int2 | number(3) |
| ushort \| ushort? | smallint(5) unsigned | int | int4 | number(5) | unsigned | number(5) |
| uint \| uint? | int(10) unsigned | bigint | int8 | number(10) | decimal(10,0) | number(10) |
| ulong \| ulong? | bigint(20) unsigned | decimal(20,0) | numeric(20,0) | number(20) | decimal(21,0) | number(20) |
| double \| double? | double | float | float8 | float(126) | double | double |
| float \| float? | float | real | float4 | float(63) | float | real |
| decimal \| decimal? | decimal(10,2) | decimal(10,2) | numeric(10,2) | number(10,2) | decimal(10,2) | number(10,2) |
| Guid \| Guid? | char(36) | uniqueidentifier | uuid | char(36 CHAR) | character(36) | char(36) |
| TimeSpan \| TimeSpan? | time | time | time | interval day(2) to second(6) | bigint | - |
| DateTime \| DateTime? | datetime | datetime | timestamp | timestamp(6) | datetime | timestamp(6) |
| DateTimeOffset \| DateTimeOffset? | - | datetimeoffset | - | timestamp(6) with local time zone | - | timestamp(6) |
| Enum \| Enum? | enum | int | int4 | number(16) | mediumint | number(16) |
| FlagsEnum \| FlagsEnum? | set | bigint | int8 | number(32) | bigint | number(32) |
| byte[] | varbinary(255) | varbinary(255) | bytea | blob | blob | blob |
| string | varchar(255) | nvarchar(255) | varchar(255) | nvarchar2(255) | nvarchar(255) | nvarchar2(255) |
> 以上类型和长度是默认值,可手工设置 Column 特性 DbType 值
> string 指定长度 [Column(DbType = "varchar(max)")] 或者 [MaxLength(-1)] 或者 [Column(StringLength = -1)],当长度 -1 时产生的映射如下:
| MySql | PostgreSQL | SqlServer | Oracle | Sqlite | Firebird | MsAccess | 达梦 | 金仓 | 神通 | 南大 |
| - | - | - | - | - | - | - | - | - | - | - |
| text | text | nvarchar(max) | nclob | text | blob sub_type 1 | longtext | text | text | text | text |
> 注意Oracle nclob 需要 v1.3.2+ 版本才支持,否则将映射 nvarchar2(4000)
> 注意MySql [MaxLength(-2)] 或者 [Column(StringLength = -2)] 映射类型 longtext其他数据库的映射规则与 -1 相同
> decimal 指定长度 [Column(Precision = 10, Scale = 2)]
## MySql 特别类型映射
| csharp | MySql |
| - | - |
| MygisPoint | point |
| MygisLineString | linestring |
| MygisPolygon | polygon |
| MygisMultiPoint | multipoint |
| csharp | MySql |
| -------------------- | --------------- |
| MygisPoint | point |
| MygisLineString | linestring |
| MygisPolygon | polygon |
| MygisMultiPoint | multipoint |
| MygisMultiLineString | multilinestring |
| MygisMultiPolygon | multipolygon |
| MygisMultiPolygon | multipolygon |
## Mysql注意事项
如果``int、byte``类型,指定了 ``DbType="tinyint(1)"``,请注意,``tinyint(1)``在ado.net中默认将此值映射为``bool``类型,可在链接串中指定``TreatTinyAsBoolean=false``,使映射 ``tinyint(1) ``为 ``SByte`` 而非 ``bool``。
> MySql 如果 ``int、byte``类型,指定了 ``DbType="tinyint(1)"``,请注意,``tinyint(1)``在ado.net中默认将此值映射为``bool``类型,可在链接串中指定``TreatTinyAsBoolean=false``,使映射 ``tinyint(1) ``为 ``SByte`` 而非 ``bool``。
## PostgreSQL 特别类型映射
FreeSql.Provider.PostgreSQL
| csharp | PostgreSQL |
| - | - |
| BitArray | varbit(64) |
| NpgsqlPoint \| NpgsqlPoint? | point |
| NpgsqlLine \| NpgsqlLine? | line |
| NpgsqlLSeg \| NpgsqlLSeg? | lseg |
| NpgsqlBox \| NpgsqlBox? | box |
| NpgsqlPath \| NpgsqlPath? | path |
| NpgsqlPolygon \| NpgsqlPolygon? | polygon |
| NpgsqlCircle \| NpgsqlCircle? | circle |
| (IPAddress Address, int Subnet) \| (IPAddress Address, int Subnet)? | cidr |
| IPAddress | inet |
| PhysicalAddress | macaddr |
| NpgsqlRange\<int\> \| NpgsqlRange\<int\>? | int4range |
| NpgsqlRange\<long\> \| NpgsqlRange\<long\>? | int8range |
| NpgsqlRange\<decimal\> \| NpgsqlRange\<decimal\>? | numrange |
| NpgsqlRange\<DateTime\> \| NpgsqlRange\<DateTime\>? | tsrange |
| PostgisPoint | geometry |
| PostgisLineString | geometry |
| PostgisPolygon | geometry |
| PostgisMultiPoint | geometry |
| PostgisMultiLineString | geometry |
| PostgisMultiPolygon | geometry |
| PostgisGeometry | geometry |
| PostgisGeometryCollection | geometry |
| Dictionary\<string, string\> | hstore |
| JToken | jsonb |
| JObject | jsonb |
| JArray | jsonb |
| 数组 | 以上所有类型都支持,包括默认类型 |
| csharp | PostgreSQL |
| ------------------------------------------------------------------- | -------------------------------- |
| BitArray | varbit(64) |
| NpgsqlPoint \| NpgsqlPoint? | point |
| NpgsqlLine \| NpgsqlLine? | line |
| NpgsqlLSeg \| NpgsqlLSeg? | lseg |
| NpgsqlBox \| NpgsqlBox? | box |
| NpgsqlPath \| NpgsqlPath? | path |
| NpgsqlPolygon \| NpgsqlPolygon? | polygon |
| NpgsqlCircle \| NpgsqlCircle? | circle |
| (IPAddress Address, int Subnet) \| (IPAddress Address, int Subnet)? | cidr |
| IPAddress | inet |
| PhysicalAddress | macaddr |
| NpgsqlRange\<int\> \| NpgsqlRange\<int\>? | int4range |
| NpgsqlRange\<long\> \| NpgsqlRange\<long\>? | int8range |
| NpgsqlRange\<decimal\> \| NpgsqlRange\<decimal\>? | numrange |
| NpgsqlRange\<DateTime\> \| NpgsqlRange\<DateTime\>? | tsrange |
| PostgisPoint | geometry |
| PostgisLineString | geometry |
| PostgisPolygon | geometry |
| PostgisMultiPoint | geometry |
| PostgisMultiLineString | geometry |
| PostgisMultiPolygon | geometry |
| PostgisGeometry | geometry |
| PostgisGeometryCollection | geometry |
| Dictionary\<string, string\> | hstore |
| JToken | jsonb |
| JObject | jsonb |
| JArray | jsonb |
| 数组 | 以上所有类型都支持,包括默认类型 |
## 自定义重写(RewriteSql)、重读(RereadSql)
## 重写、重读
写入时重写 SQL、读取时重写 SQL适合 geography 类型的读写场景。
@@ -202,21 +193,3 @@ public string geo { get; set; }
//FROM [ts_geocrud01] a
//WHERE (a.[id] = 'c7227d5e-0bcf-4b71-8f0f-d69a552fe84e')
```
## 优先级
从数据库导入特性 > 实体特性 > FluentApi > Aop
## 参考资料
- [《实体特性说明》](%e5%ae%9e%e4%bd%93%e7%89%b9%e6%80%a7)
- [《FluentApi享受纯净实体类》](FluentApi)
- [《导入数据库特性,懒人专利》](%e5%af%bc%e5%85%a5%e6%95%b0%e6%8d%ae%e5%ba%93%e7%89%b9%e6%80%a7)
- [《Aop自定义特性与其他 ORM 共用特性》](%e8%87%aa%e5%ae%9a%e4%b9%89%e7%89%b9%e6%80%a7)
- [《导航关系配置》](%e5%ae%9e%e4%bd%93%e5%85%b3%e7%b3%bb)
- [《CodeFirst模式开发介绍》](CodeFirst)