FreeSql 支持 CodeFirst 迁移结构至数据库,这应该是(O/RM)必须标配的一个功能。html
与其余(O/RM)不一样FreeSql支持更多的数据库特性,而不仅是支持基础的数据类型,这既是优势也是缺点,优势是充分利用数据库特性辅助开发,缺点是切换数据库变得困难。不一样程序员的理念可能不太一致,做为功能库FreeSql支持到了极致,至因而否使用是项目组技术衡量的另外一个问题。mysql
尽管多种数据库适配逻辑很是复杂,FreeSql始终秉承优化程序开发习惯的原则尽可能去实现,中间碰到了一些非技术没法攻克的难题,好比数据库的自定义类型,和实体类自己就是一种冲突,为了减小使用成本,诸如此类的数据库功能没有获得支持。git
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) //自动同步实体结构【开发环境必备】 .Build();
《实体特性说明》程序员
《FluentApi,享受纯净实体类》github
《导航关系配置》安全
实体&表对比 | 添加 | 更名 | 删除 |
---|---|---|---|
√ | √ | X |
实体属性&字段对比 | 添加 | 修改可空 | 修改自增 | 修改类型 | 更名 | 删除 | 备注 |
---|---|---|---|---|---|---|---|
√ | √ | √ | √ | √ | X | √ |
为了保证安全,不提供删除字段。优化
警告:若是实体类属性,与数据库表字段不完整映射的时候,未映射的字段有可能发生丢失。
缘由:某些迁移对比操做是:建立临时表、导入旧表数据、删除旧表。
FreeSql提供两种CodeFirst移迁方法,自动和手动。
自动同步实体结构到数据库,程序运行中检查实体表是否存在,而后迁移执行建立或修改。
fsql.CodeFirst.IsAutoSyncDataStructure = true;
此功能默认为开启状态,发布正式环境后,请修改此设置。
虽然【自动同步实体结构】功能开发很是好用,可是有个坏处,就是数据库后面会很乱,没用的字段可能一大堆,应尽可能控制实体或属性命名的修改。
当【实体类】对应的是数据库【视图】或者其余时,可经过 [Table(DisableSyncStructure = true)] 禁用指定的实体迁移操做。
[Table(DisableSyncStructure = true)] class ModelDisableSyncStructure { [Column(IsPrimary = false)] public int pkid { get; set; } }
FreeSql CodeFirst 支持将 c# 代码内的注释,迁移至数据库的备注。先决条件:
一、实体类所在程序集,须要开启 xml 文档功能;
二、xml 文件必须与程序集同目录,且文件名:xxx.dll -> xxx.xml;
提供接口方法实现对比实体,与数据库中的变化部分,返回SQL语句。
var t1 = mysql.CodeFirst.GetComparisonDDLStatements<Topic>(); class Topic { [Column(IsIdentity = true, IsPrimary = true)] public int Id { get; set; } public int Clicks { 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;
提供接口方法实现同步结构
var t2 = fsql.CodeFirst.SyncStructure<Topic>(); //同步实体类型到数据库
指定实体的表名,指定 Name 后,实体类名变化不影响数据库对应的表。FreeSql尽可能支持了对多数据库或schema支持,不防试试指定表名为:其余数据库.表名,不一样数据库的指定方式有差别,这一点之后深刻解答。
[Table(Name = "db2.tb_topic111")] class Topic { //... }
无指定实体的表名,修改成实体类名。指定数据库旧的表名,修改实体命名时,同时设置此参数为修改以前的值,CodeFirst才能够正确修改数据库表;不然将视为【建立新表】。
[Table(OldName = "Topic")] class Topic2 { //... }
ALTER TABLE `cccddd`.`Topic` RENAME TO `cccddd`.`Topic2`;
修改字段类型,把 Title 类型改成 varchar(128)。
[Column(DbType = "varchar(128)")] public string Title { get; set; }
ALTER TABLE `cccddd`.`Topic2` MODIFY `Title` VARCHAR(128);
指定属性的字段名,这样指定后,修改实体的属性名不影响数据库对应的列。
[Column(Name = "titl2")] public string Title { get; set; }
无指定属性的字段名,修改成属性名,指定数据库旧的列名,修改实体属性命名时,同时设置此参数为修改以前的值,CodeFirst才能够正确修改数据库字段;不然将视为【新增字段】。
[Column(OldName = "Title2")] public string Title { get; set; }
ALTER TABLE `cccddd`.`Topic2` CHANGE COLUMN `Title2` `Title` VARCHAR(255);
(三十四)CodeFirst 迁移说明