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 ...
随机推荐
- 进程间通信与ipcs使用7例
进程间通信(IPC, inter-process communication)实现进程间消息的传递,对于用户地址空间相互独立的两个进程而言,实现通信可以通过以下方式: 由内核层面分配内存,两进程共享该 ...
- android ——ListView
谷歌官方文档的介绍:https://developer.android.com/reference/android/widget/ListView.html 显示可垂直滚动的视图集合,其中每个视图都立 ...
- linux应用问题分析命令
1. 描述 应用问题分析方式及命令有很多,一般都结合着使用,今天主要介绍下: (1)top命令,实时查看服务器资源使用情况,类似windows下的资源管理器: (2)tail命令,实时刷新查看日志命令 ...
- Yii的srbac拓展中“用户已经获授权项”无法查看
Yii的srbac拓展中“用户已经获授权项”点下拉框,选择一个有权限的用户时,根本无法列出权限. 原因是srbac把数据库的表中的ID默认为数字,像 123这样,但如果不是数字像这样 'y0f22ff ...
- Spring boot中的 JsonConverter
上图是spring-web包的部分目录 为了找出调用了哪种类型的Convert 我找到父类 HttpMessageConverter 查看了它的引用 在spring-boot-autoconfigur ...
- Collectors.toMap不允许Null Value导致NPE
背景 线上某任务出现报警,报错日志如下: java.lang.NullPointerException: null at java.util.HashMap.merge(HashMap.java:12 ...
- 01 Python网络爬虫简介
什么是爬虫 爬虫就是通过编写程序模拟浏览器上网,然后去互联网上爬取/获取数据的过程. 爬虫的分类 - 通用爬虫:就是爬取互联网中的一整张页面内容. - 聚焦爬虫:根据指定的需求爬取页面中指定的局部内容 ...
- Linux环境搭建 | VMware下共享文件夹的实现
在进行程序开发的过程中,我们经常要在主机与虚拟机之间传递文件,比如说,源代码位于虚拟机,而在主机下阅读或修改源代码,这里就需要使用到 「共享文件」 这个机制了.本文介绍了两种共享文件夹的实现机制:VM ...
- Unity之Update与FixedUpdate区别
下面这段代码演示游戏暂停 using UnityEngine; using System.Collections; public class GamePauseTest : MonoBehaviour ...
- Codeforces 1004D
题意略. 思路: 有两个点要注意一下: 1.这个菱形矩阵是8对称的,也即可以是沿45°对角线对称. 2.菱形矩阵上的数字表明了这个点到中心0点的距离,这对于确定位置有帮助. 这个题目简直刷新人生观,这 ...