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

  • 《(二)自动迁移实体》()
  • 《(三)实体特性》()
  • 《(四)实体特性 Fluent Api》()
  • 《(十八)导航属性》()

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

Firebird

MsAccess

达梦

金仓

神通

text

text

varchar(max)

nclob

text

blob sub_type 1

longtext

text

text

text

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

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

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