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 遷移說明