FreeSql (三十三)CodeFirst 类型映射
前面有介绍过几篇 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)
系列文章导航
(三十三)CodeFirst 类型映射
FreeSql (三十三)CodeFirst 类型映射的更多相关文章
- FreeSql (十三)更新数据时忽略列
var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" + "Initia ...
- 第三篇:Entity Framework CodeFirst & Model 映射 续篇 EntityFramework Power Tools 工具使用
上一篇 第二篇:Entity Framework CodeFirst & Model 映射 主要介绍以Fluent API来实作EntityFramework CodeFirst,得到了大家一 ...
- 第二篇:Entity Framework CodeFirst & Model 映射
前一篇 第一篇:Entity Framework 简介 我有讲到,ORM 最关键的 Mapping,也提到了最早实现Mapping的技术,就是 特性 + 反射,那Entity Framework 实现 ...
- 总结Unity IOC容器通过配置实现类型映射的几种基本使用方法
网上关于Unity IOC容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择. 首先讲一下通过代码来进行类型映射,很简单,代码如下: unityContainer = new Un ...
- [hibernate]基本值类型映射之日期类型
hibernate基本值类型映射中日期类型支持date,time,timestamp这三个选项,其中 date:对应数据库中的date类型,表示只显示日期 time:对应数据库中的time类型,表示只 ...
- NeHe OpenGL教程 第三十三课:TGA文件
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- 第三章Hibernate关联映射
第三章Hibernate关联映射 一.关联关系 类与类之间最普通的关系就是关联关系,而且关联是有方向的. 以部门和员工为列,一个部门下有多个员工,而一个员工只能属于一个部门,从员工到部门就是多对一关联 ...
- Gradle 1.12用户指南翻译——第三十三章. PMD 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- Unity IOC容器通过配置实现类型映射的几种基本使用方法
网上关于Unity IOC容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择. 首先讲一下通过代码来进行类型映射,很简单,代码如下 unityContainer = new Uni ...
随机推荐
- mybatis的一对多双向映射
连表查询 select id resultType resultMap resultType和resultMap不能同时使用 association 属性 映射到多对一中的“一”方的“复杂类型”属性, ...
- 解决socket粘包的两种low版模式 os.popen()和struct模块
os.popen()模式 server端 import socket import os phone = socket.socket() # 实例化一个socket对象 phone.bind((&qu ...
- Fabric项目学习总结
1.Hyperledger Fabric的基本架构 2.PKI机制
- java中的各种锁详细介绍
转自:https://blog.csdn.net/axiaoboge/article/details/84335452 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高 ...
- C语言连接mysql,用GCC编译
1. main.c文件内容如下 #include <stdlib.h>#include <stdio.h>#include <winsock.h>#include ...
- serverless在微店node领域的探索应用
背景 目前微店中台团队为了满足公司大部分产品.运营以及部分后端开发人员的尝鲜和试错的需求,提供了一套基于图形化搭建的服务端接口交付方案,利用该方案及提供的系统可生成一副包含运行时环境定义可立即运行的工 ...
- 吉特日化MES-工业生产盲区
工业生产的几大盲区 1 重硬件忽略软件 : 目前只要提到智能化,大家都是想到的是一大堆自动执行的设备,什么机器人,输送线,人脸识别摄像头等,在一成套的系统中可能硬件几百万上千万,软件可以是几万几千几 ...
- spark sql/hive小文件问题
针对hive on mapreduce 1:我们可以通过一些配置项来使Hive在执行结束后对结果文件进行合并: 参数详细内容可参考官网:https://cwiki.apache.org/conflue ...
- 纯数据结构Java实现(6/11)(二叉堆&优先队列)
堆其实也是树结构(或者说基于树结构),一般可以用堆实现优先队列. 二叉堆 堆可以用于实现其他高层数据结构,比如优先队列 而要实现一个堆,可以借助二叉树,其实现称为: 二叉堆 (使用二叉树表示的堆). ...
- Docker跨服务器通信Overlay解决方案(下) Consul集群
承接上文 本文基于上篇文章,详细的场景说明与分析在前篇随笔中业已记录,有兴趣可以移步 Docker跨服务器通信Overlay解决方案(上) Consul单实例 本文主旨 本文为Docker使用Cons ...