FreeSql/Docs/codefirst.md
2018-12-26 20:31:31 +08:00

5.9 KiB
Raw Blame History

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<string, string> - - hstore
JToken - - jsonb
JObject - - jsonb
JArray - - jsonb
数组 - - 以上所有类型都支持

以上类型和长度是默认值,可手工设置,如 string 属性可指定 [Column(DbType = "varchar(max)")]

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();

自动同步实体结构【开发环境必备】

自动同步实体结构到数据库,程序运行中检查实体表是否存在,然后创建或修改

fsql.CodeFirst.IsAutoSyncDataStructure = true;

此功能默认为开启状态,发布正式环境后,请修改此设置

虽然【自动同步实体结构】功能开发非常好用,但是有个坏处,就是数据库后面会很乱,没用的字段一大堆

手工同步实体结构

实体&表对比 添加 改名 删除
X
实体属性&字段对比 添加 修改可空 修改自增 修改类型 改名 删除
X

为了保证安全,不提供删除字段

1、提供方法对比实体与数据库中的变化部分

var t1 = mysql.CodeFirst.GetComparisonDDLStatements<Topic>();

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; }
}
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 后,实体类名变化不影响数据库对应的表

[Table(Name = "tb_topic111")]
class Topic {
  //...
}

3、无指定实体的表名修改实体类名

指定数据库旧的表名修改实体命名时同时设置此参数为修改之前的值CodeFirst才可以正确修改数据库表否则将视为【创建新表】

[Table(OldName = "Topic")]
class Topic2 {
  //...
}
ALTER TABLE `cccddd`.`Topic` RENAME TO `cccddd`.`Topic2`;

4、修改属性的类型

把 Id 类型改为 uint 后

ALTER TABLE `cccddd`.`Topic2` MODIFY `Id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT;
[Column(DbType = "varchar(128)")]
public string Title { get; set; }
ALTER TABLE `cccddd`.`Topic2` MODIFY `Title2` VARCHAR(128);

5、指定属性的字段名

这样指定后,修改实体的属性名不影响数据库对应的列

[Column(Name = "titl2")]
public string Title { get; set; }

6、无指定属性的字段名修改属性名

指定数据库旧的列名修改实体属性命名时同时设置此参数为修改之前的值CodeFirst才可以正确修改数据库字段否则将视为【新增字段】

[Column(OldName = "Title2")]
public string Title { get; set; }
ALTER TABLE `cccddd`.`Topic2` CHANGE COLUMN `Title2` `Title` VARCHAR(255);

7、提供方法同步结构

var t2 = fsql.CodeFirst.SyncStructure<Topic>();
//同步实体类型到数据库