# CodeFirst ## 映射映射 | csharp | MySql | SqlServer | PostgreSQL | | - | - | - | - | | bool \| bool? | bit(1) | bit | bool | | sbyte \| sbyte? | tinyint(3) | smallint | int2 | | short \| short? | smallint(6) | smallint | int2 | | int \| int? | int(11) | int | int4 | | long \| long? | bigint(20) | bigint | int8 | | byte \| byte? | tinyint(3) unsigned | tinyint | int2 | | ushort \| ushort? | smallint(5) unsigned | int | int4 | | uint \| uint? | int(10) unsigned | bigint | int8 | | ulong \| ulong? | bigint(20) unsigned | decimal(20,0) | numeric(20,0) | | double \| double? | double | float | float8 | | float \| float? | float | real | float4 | | decimal \| decimal? | decimal(10,2) | decimal(10,2) | numeric(10,2) | | Guid \| Guid? | char(36) | uniqueidentifier | uuid | | TimeSpan \| TimeSpan? | time | time | time | | DateTime \| DateTime? | datetime | datetime | timestamp | | DateTimeOffset \| DateTimeOffset? | - | - | datetimeoffset | | Enum \| Enum? | enum | int | int4 | | FlagsEnum \| FlagsEnum? | set | bigint | int8 | | byte[] | varbinary(255) | varbinary(255) | bytea | | string | varchar(255) | nvarchar(255) | varchar(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 \| NpgsqlRange? | - | - | int4range | | NpgsqlRange \| NpgsqlRange? | - | - | int8range | | NpgsqlRange \| NpgsqlRange? | - | - | numrange | | NpgsqlRange \| NpgsqlRange? | - | - | tsrange | | PostgisPoint | - | - | geometry | | PostgisLineString | - | - | geometry | | PostgisPolygon | - | - | geometry | | PostgisMultiPoint | - | - | geometry | | PostgisMultiLineString | - | - | geometry | | PostgisMultiPolygon | - | - | geometry | | PostgisGeometry | - | - | geometry | | Dictionary | - | - | hstore | | JToken | - | - | jsonb | | JObject | - | - | jsonb | | JArray | - | - | jsonb | | 数组 | - | - | 以上所有类型都支持 | > 以上类型和长度是默认值,可手工设置,如 string 属性可指定 [Column(DbType = "varchar(max)")] ```csharp IFreeSql fsql = new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10") .Build(); ``` ### 自动同步实体结构【开发环境必备】 自动同步实体结构到数据库,程序运行中检查实体表是否存在,然后创建或修改 ```csharp fsql.CodeFirst.IsAutoSyncDataStructure = true; ``` > 此功能默认为开启状态,发布正式环境后,请修改此设置 > 虽然【自动同步实体结构】功能开发非常好用,但是有个坏处,就是数据库后面会很乱,没用的字段一大堆 ### 手工同步实体结构 | 实体&表对比 | 添加 | 改名 | 删除 | | - | - | - | - | | | √ | √ | X | | 实体属性&字段对比 | 添加 | 修改可空 | 修改自增 | 修改类型 | 改名 | 删除 | | - | - | - | - | - | - | - | | | √ | √ | √ | √ | √ | X | > 为了保证安全,不提供删除字段 1、提供方法对比实体,与数据库中的变化部分 ```csharp var t1 = mysql.CodeFirst.GetComparisonDDLStatements(); class Topic { [Column(IsIdentity = true, IsPrimary = true)] public int Id { get; set; } public int Clicks { get; set; } public TestTypeInfo Type { get; set; } public string Title { get; set; } public DateTime CreateTime { get; set; } public ushort fusho { get; set; } } ``` ```sql CREATE TABLE IF NOT EXISTS `cccddd`.`Topic` ( `Id` INT(11) NOT NULL AUTO_INCREMENT, `Clicks` INT(11) NOT NULL, `Title` VARCHAR(255), `CreateTime` DATETIME NOT NULL, `fusho` SMALLINT(5) UNSIGNED NOT NULL, PRIMARY KEY (`Id`) ) Engine=InnoDB CHARACTER SET utf8; ``` 2、指定实体的表名 指定 Name 后,实体类名变化不影响数据库对应的表 ```csharp [Table(Name = "tb_topic111")] class Topic { //... } ``` 3、无指定实体的表名,修改实体类名 指定数据库旧的表名,修改实体命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库表;否则将视为【创建新表】 ```csharp [Table(OldName = "Topic")] class Topic2 { //... } ``` ```sql ALTER TABLE `cccddd`.`Topic` RENAME TO `cccddd`.`Topic2`; ``` 4、修改属性的类型 把 Id 类型改为 uint 后 ```sql ALTER TABLE `cccddd`.`Topic2` MODIFY `Id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT; ``` ```csharp [Column(DbType = "varchar(128)")] public string Title { get; set; } ``` ```sql ALTER TABLE `cccddd`.`Topic2` MODIFY `Title2` VARCHAR(128); ``` 5、指定属性的字段名 这样指定后,修改实体的属性名不影响数据库对应的列 ```csharp [Column(Name = "titl2")] public string Title { get; set; } ``` 6、无指定属性的字段名,修改属性名 指定数据库旧的列名,修改实体属性命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库字段;否则将视为【新增字段】 ```csharp [Column(OldName = "Title2")] public string Title { get; set; } ``` ```sql ALTER TABLE `cccddd`.`Topic2` CHANGE COLUMN `Title2` `Title` VARCHAR(255); ``` 7、提供方法同步结构 ```csharp var t2 = fsql.CodeFirst.SyncStructure(); //同步实体类型到数据库 ```