FreeSql 支持 CodeFirst 遷移結構至數據庫,這應該是(O/RM)必須標配的一個功能。
與其他(O/RM)不同FreeSql支持更多的數據庫特性,而不只是支持基礎的數據類型,這既是優點也是缺點,優點是充分利用數據庫特性輔助開發,缺點是切換數據庫變得困難。不同程序員的理念可能不太一致,作為功能庫FreeSql支持到了極致,至于是否使用是項目組技術衡量的另一個問題。
盡管多種數據庫適配邏輯非常復雜,FreeSql始終秉承優化程序開發習慣的原則盡量去實現,中間碰到了一些非技術無法攻克的難題,比如數據庫的自定義類型,和實體類本身就是一種沖突,為了減少使用成本,諸如此類的數據庫功能沒有得到支持。
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,享受純凈實體類》
《導入數據庫特性,懶人專利》
《Aop自定義特性,與其他 ORM 共用特性》
《類型映射,一覽便知》
《導航關系配置》
遷移結構
實體&表對比 | 添加 | 改名 | 刪除 |
---|---|---|---|
√ | √ | 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# 代碼內的注釋,遷移至數據庫的備注。先決條件:
1、實體類所在程序集,需要開啟 xml 文檔功能;
2、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);
系列文章導航
(一)入門
(二)自動遷移實體
(三)實體特性
(四)實體特性 Fluent Api
(五)插入數據
(六)批量插入數據
(七)插入數據時忽略列
(八)插入數據時指定列
(九)刪除數據
(十)更新數據
(十一)更新數據 Where
(十二)更新數據時指定列
(十三)更新數據時忽略列
(十四)批量更新數據
(十五)查詢數據
(十六)分頁查詢
(十七)聯表查詢
(十八)導航屬性
(十九)多表查詢
(二十)多表查詢 WhereCascade
(二十一)查詢返回數據
(二十二)Dto 映射查詢
(二十三)分組、聚合
(二十四)Linq To Sql 語法使用介紹
(二十五)延時加載
(二十六)貪婪加載 Include、IncludeMany、Dto、ToList
(二十七)將已寫好的 SQL 語句,與實體類映射進行二次查詢
(二十八)事務
(二十九)Lambda 表達式
(三十)讀寫分離
(三十一)分區分表
(三十二)Aop
(三十三)CodeFirst 類型映射
(三十四)CodeFirst 遷移說明
(三十五)CodeFirst 自定義特性