From abdaf40eee4b3850a75b9a4c04f3c3ca6ae9ffaf Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@users.noreply.github.com> Date: Mon, 19 Aug 2024 15:12:12 +0800 Subject: [PATCH] =?UTF-8?q?Updated=20=E7=B1=BB=E5=9E=8B=E6=98=A0=E5=B0=84?= =?UTF-8?q?=20(markdown)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 类型映射.md | 275 +++++++++++++++++++++++----------------------------- 1 file changed, 124 insertions(+), 151 deletions(-) diff --git a/类型映射.md b/类型映射.md index eb2ef24..cb4e7ab 100644 --- a/类型映射.md +++ b/类型映射.md @@ -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().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 } ``` -### 使用 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\ \| NpgsqlRange\? | int4range | -| NpgsqlRange\ \| NpgsqlRange\? | int8range | -| NpgsqlRange\ \| NpgsqlRange\? | numrange | -| NpgsqlRange\ \| NpgsqlRange\? | tsrange | -| PostgisPoint | geometry | -| PostgisLineString | geometry | -| PostgisPolygon | geometry | -| PostgisMultiPoint | geometry | -| PostgisMultiLineString | geometry | -| PostgisMultiPolygon | geometry | -| PostgisGeometry | geometry | -| PostgisGeometryCollection | geometry | -| Dictionary\ | 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\ \| NpgsqlRange\? | int4range | +| NpgsqlRange\ \| NpgsqlRange\? | int8range | +| NpgsqlRange\ \| NpgsqlRange\? | numrange | +| NpgsqlRange\ \| NpgsqlRange\? | tsrange | +| PostgisPoint | geometry | +| PostgisLineString | geometry | +| PostgisPolygon | geometry | +| PostgisMultiPoint | geometry | +| PostgisMultiLineString | geometry | +| PostgisMultiPolygon | geometry | +| PostgisGeometry | geometry | +| PostgisGeometryCollection | geometry | +| Dictionary\ | 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) \ No newline at end of file