FreeSql/Docs/codefirst.md
2019-01-07 22:04:31 +08:00

6.7 KiB
Raw Blame History

CodeFirst

类型映射

csharp MySql SqlServer PostgreSQL oracle
bool | bool? bit(1) bit bool number(1)
sbyte | sbyte? tinyint(3) smallint int2 number(4)
short | short? smallint(6) smallint int2 number(6)
int | int? int(11) int int4 number(11)
long | long? bigint(20) bigint int8 number(21)
byte | byte? tinyint(3) unsigned tinyint int2 number(3)
ushort | ushort? smallint(5) unsigned int int4 number(5)
uint | uint? int(10) unsigned bigint int8 number(10)
ulong | ulong? bigint(20) unsigned decimal(20,0) numeric(20,0) number(20)
double | double? double float float8 float(126)
float | float? float real float4 float(63)
decimal | decimal? decimal(10,2) decimal(10,2) numeric(10,2) number(10,2)
Guid | Guid? char(36) uniqueidentifier uuid char(36 CHAR)
TimeSpan | TimeSpan? time time time interval day(2) to second(6)
DateTime | DateTime? datetime datetime timestamp timestamp(6)
DateTimeOffset | DateTimeOffset? - - datetimeoffset timestamp(6) with local time zone
Enum | Enum? enum int int4 number(16)
FlagsEnum | FlagsEnum? set bigint int8 number(32)
byte[] varbinary(255) varbinary(255) bytea blob
string varchar(255) nvarchar(255) varchar(255) nvarchar2(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)")]

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")
    .UseAutoSyncStructure(true)

    .UseMonitorCommand(
        cmd => {
            Console.WriteLine(cmd.CommandText);
        }, //监听SQL命令对象在执行前
        (cmd, traceLog) => {
            Console.WriteLine(traceLog);
        }) //监听SQL命令对象在执行后
    .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>();
//同步实体类型到数据库