类别:学习文档

日期:2021-07-15 浏览:2218 评论:0

前面有介绍过几篇 CodeFirst 内容文章,有

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

默认类型映射

csharpMySqlSqlServerPostgreSQLOracleSqlite
bool | bool?bit(1)bitboolnumber(1)boolean
sbyte | sbyte?tinyint(3)smallintint2number(4)smallint
short | short?smallint(6)smallintint2number(6)smallint
int | int?int(11)intint4number(11)integer
long | long?bigint(20)bigintint8number(21)integer
byte | byte?tinyint(3) unsignedtinyintint2number(3)int2
ushort | ushort?smallint(5) unsignedintint4number(5)unsigned
uint | uint?int(10) unsignedbigintint8number(10)decimal(10,0)
ulong | ulong?bigint(20) unsigneddecimal(20,0)numeric(20,0)number(20)decimal(21,0)
double | double?doublefloatfloat8float(126)double
float | float?floatrealfloat4float(63)float
decimal | decimal?decimal(10,2)decimal(10,2)numeric(10,2)number(10,2)decimal(10,2)
Guid | Guid?char(36)uniqueidentifieruuidchar(36 CHAR)character(36)
TimeSpan | TimeSpan?timetimetimeinterval day(2) to second(6)bigint
DateTime | DateTime?datetimedatetimetimestamptimestamp(6)datetime
DateTimeOffset | DateTimeOffset?-datetimeoffset-timestamp(6) with local time zone-
Enum | Enum?enumintint4number(16)mediumint
FlagsEnum | FlagsEnum?setbigintint8number(32)bigint
byte[]varbinary(255)varbinary(255)byteablobblob
stringvarchar(255)nvarchar(255)varchar(255)nvarchar2(255)nvarchar(255)
MygisPointpoint----
MygisLineStringlinestring----
MygisPolygonpolygon----
MygisMultiPointmultipoint----
MygisMultiLineStringmultilinestring----
MygisMultiPolygonmultipolygon----
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 时产生的映射如下:

MySqlPostgreSQLSqlServerOracleSqliteFirebirdMsAccess达梦金仓神通
texttextvarchar(max)nclobtextblob sub_type 1longtexttexttexttext

注意:Oracle nclob 需要 v1.3.2+ 版本才支持,否则将映射 nvarchar2(4000)

注意:MySql [MaxLength(-2)] 或者 [Column(StringLength = -2)] 映射类型 longtext,其他数据库的映射规则与 -1 相同

decimal 指定长度 [Column(Precision = 10, Scale = 2)]

系列文章导航

FreeSql (一)入门及安装 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二)自动迁移实体 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三)实体特性 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (四)实体特性 Fluent Api - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (五)插入数据 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (六)批量插入数据 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (七)插入数据时忽略列 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (八)插入数据时指定列 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (九)删除数据 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十)更新数据 - 学习文档 - 零一的世界 (vtzw.com)FreeSql (十一)更新数据 Where - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十二)更新数据时指定列 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十三)更新数据时忽略列 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十四)批量更新数据 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十五)查询数据 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十六)分页查询 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十七)联表查询 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十八)导航属性 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十九)多表查询 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十)多表查询 WhereCascade - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十一)查询返回数据 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十二)Dto 映射查询 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十三)分组、聚合 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十四)Linq To Sql 语法使用介绍 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十五)延时加载 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十六)贪婪加载 Include、IncludeMany - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十七)将已写好的 SQL 语句,与实体类映射进行二次查询 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十八)事务 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十九)Lambda 表达式 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三十)读写分离 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三十一)分表分库 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三十二)Aop - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三十三)CodeFirst 类型映射 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三十四)CodeFirst 迁移说明 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三十五)CodeFirst 自定义特性 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三十六)进阶 仓储系列文档 - 学习文档 - 零一的世界 (vtzw.com)


本文标题:FreeSql (三十三)CodeFirst 类型映射
本文链接:https://vtzw.com/post/731.html
作者授权:除特别说明外,本文由 零一 原创编译并授权 零一的世界 刊载发布。
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。
 您阅读本篇文章共花了: 

 可能感兴趣的文章

评论区

发表评论 / 取消回复

必填

选填

选填

◎欢迎讨论,请在这里发表您的看法及观点。

最新留言