前面有介紹過幾篇 CodeFirst 內容文章,有
- 《(二)自動遷移實體》(https://www.cnblogs.com/FreeSql/p/11531301.html)
- 《(三)實體特性》(https://www.cnblogs.com/FreeSql/p/11531302.html)
- 《(四)實體特性 Fluent Api》(https://www.cnblogs.com/FreeSql/p/11531304.html)
- 《(十八)導航屬性》(https://www.cnblogs.com/FreeSql/p/11531352.html)
入門 FreeSql 前這些算是基礎教程,需要提前了解,接下來進入 CodeFirst 功能的深入了解。
類型映射是 ORM 最重要的功能之一,FreeSql 支持各種數據庫大多數類型,包括 mysql 的 enum/set,pgsql 的 hstore/jsonb 等等。。除此默認之外,還提供了自定義類型映射。
類型映射,需要考慮寫入(我們的寫入需要考慮 NoneParameter 和 Parameter)、讀取時的轉換工作,這部分擴展對個人使用者而言比較復雜,如有需要請提出您的 issues。
FreeSql 擁有較高容錯處理,如:當數據庫類型為 bigint 可空,實體類為 int 時,讀取數據不會出錯。
自定義類型映射(MapType)
class EnumTestMap {
public Guid id { get; set; }
[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 == 判斷可以使用,無法實現 + - * / 等操作;
FreeSql.Extensions.JsonMap
上面的 MapType 只能處理有限的類型,JsonMap 是一個擴展包,實現屬性對象映射為 varchar 字段,寫入時使用 json.net 序列化,讀取時使用 json.net 反序列化。
安裝擴展包:
dotnet add package FreeSql.Extensions.JsonMap
fsql.UseJsonMap(); //開啟功能, fsql 為 IFreeSql 對象
class TestConfig
{
public int clicks { get; set; }
public string title { get; set; }
}
[Table(Name = "sysconfig")]
public class S_SysConfig<T>
{
[Column(IsPrimary = true)]
public string Name { get; set; }
[JsonMap]
public T Config { get; set; }
}
默認類型映射
csharp | MySql | SqlServer | PostgreSQL | Oracle | Sqlite |
---|---|---|---|---|---|
bool | bool? | bit(1) | bit | bool | number(1) | boolean |
sbyte | sbyte? | tinyint(3) | smallint | int2 | number(4) | smallint |
short | short? | smallint(6) | smallint | int2 | number(6) | smallint |
int | int? | int(11) | int | int4 | number(11) | integer |
long | long? | bigint(20) | bigint | int8 | number(21) | integer |
byte | byte? | tinyint(3) unsigned | tinyint | int2 | number(3) | int2 |
ushort | ushort? | smallint(5) unsigned | int | int4 | number(5) | unsigned |
uint | uint? | int(10) unsigned | bigint | int8 | number(10) | decimal(10,0) |
ulong | ulong? | bigint(20) unsigned | decimal(20,0) | numeric(20,0) | number(20) | decimal(21,0) |
double | double? | double | float | float8 | float(126) | double |
float | float? | float | real | float4 | float(63) | float |
decimal | decimal? | decimal(10,2) | decimal(10,2) | numeric(10,2) | number(10,2) | decimal(10,2) |
Guid | Guid? | char(36) | uniqueidentifier | uuid | char(36 CHAR) | character(36) |
TimeSpan | TimeSpan? | time | time | time | interval day(2) to second(6) | bigint |
DateTime | DateTime? | datetime | datetime | timestamp | timestamp(6) | datetime |
DateTimeOffset | DateTimeOffset? | - | - | datetimeoffset | timestamp(6) with local time zone | - |
Enum | Enum? | enum | int | int4 | number(16) | mediumint |
FlagsEnum | FlagsEnum? | set | bigint | int8 | number(32) | bigint |
byte[] | varbinary(255) | varbinary(255) | bytea | blob | blob |
string | varchar(255) | nvarchar(255) | varchar(255) | nvarchar2(255) | nvarchar(255) |
MygisPoint | point | - | - | - | - |
MygisLineString | linestring | - | - | - | - |
MygisPolygon | polygon | - | - | - | - |
MygisMultiPoint | multipoint | - | - | - | - |
MygisMultiLineString | multilinestring | - | - | - | - |
MygisMultiPolygon | multipolygon | - | - | - | - |
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 | - | - |
數組 | - | - | 以上所有類型都支持 | - | - |
string 指定長度 [Column(DbType = "varchar(max)")] 或者 [MaxLength(-1)] 或者 [Column(StringLength = -1)],當長度 -1 時產生的映射如下:
MySql | PostgreSQL | SqlServer | Oracle | Sqlite | MsAccess |
---|---|---|---|---|---|
text | text | varchar(max) | nclob | text | longtext |
注意:Oracle nclob 需要 v1.3.2+ 版本才支持,否則將映射 nvarchar2(4000)
注意:MySql [MaxLength(-2)] 或者 [Column(StringLength = -2)] 映射類型 longtext,其他數據庫的映射規則與 -1 相同
decimal 指定長度 [Column(Precision = 10, Scale = 2)]
系列文章導航
-
(三十三)CodeFirst 類型映射