FreeSql (三十四)CodeFirst 迁移说明
FreeSql 支持 CodeFirst 遷移結(jié)構(gòu)至數(shù)據(jù)庫,這應(yīng)該是(O/RM)必須標(biāo)配的一個功能。
與其他(O/RM)不同F(xiàn)reeSql支持更多的數(shù)據(jù)庫特性,而不只是支持基礎(chǔ)的數(shù)據(jù)類型,這既是優(yōu)點也是缺點,優(yōu)點是充分利用數(shù)據(jù)庫特性輔助開發(fā),缺點是切換數(shù)據(jù)庫變得困難。不同程序員的理念可能不太一致,作為功能庫FreeSql支持到了極致,至于是否使用是項目組技術(shù)衡量的另一個問題。
盡管多種數(shù)據(jù)庫適配邏輯非常復(fù)雜,FreeSql始終秉承優(yōu)化程序開發(fā)習(xí)慣的原則盡量去實現(xiàn),中間碰到了一些非技術(shù)無法攻克的難題,比如數(shù)據(jù)庫的自定義類型,和實體類本身就是一種沖突,為了減少使用成本,諸如此類的數(shù)據(jù)庫功能沒有得到支持。
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) //自動同步實體結(jié)構(gòu)【開發(fā)環(huán)境必備】.Build();《實體特性說明》
《FluentApi,享受純凈實體類》
《導(dǎo)入數(shù)據(jù)庫特性,懶人專利》
《Aop自定義特性,與其他 ORM 共用特性》
《類型映射,一覽便知》
《導(dǎo)航關(guān)系配置》
遷移結(jié)構(gòu)
| √ | √ | X |
| √ | √ | √ | √ | √ | X | √ |
為了保證安全,不提供刪除字段。
警告:如果實體類屬性,與數(shù)據(jù)庫表字段不完整映射的時候,未映射的字段有可能發(fā)生丟失。
原因:某些遷移對比操作是:創(chuàng)建臨時表、導(dǎo)入舊表數(shù)據(jù)、刪除舊表。
FreeSql提供兩種CodeFirst移遷方法,自動和手動。
自動同步實體結(jié)構(gòu)【開發(fā)環(huán)境必備】
自動同步實體結(jié)構(gòu)到數(shù)據(jù)庫,程序運行中檢查實體表是否存在,然后遷移執(zhí)行創(chuàng)建或修改。
fsql.CodeFirst.IsAutoSyncDataStructure = true;此功能默認為開啟狀態(tài),發(fā)布正式環(huán)境后,請修改此設(shè)置。
雖然【自動同步實體結(jié)構(gòu)】功能開發(fā)非常好用,但是有個壞處,就是數(shù)據(jù)庫后面會很亂,沒用的字段可能一大堆,應(yīng)盡量控制實體或?qū)傩悦男薷摹?/p>
禁用遷移
當(dāng)【實體類】對應(yīng)的是數(shù)據(jù)庫【視圖】或者其他時,可通過 [Table(DisableSyncStructure = true)] 禁用指定的實體遷移操作。
[Table(DisableSyncStructure = true)] class ModelDisableSyncStructure {[Column(IsPrimary = false)]public int pkid { get; set; } }備注
FreeSql CodeFirst 支持將 c# 代碼內(nèi)的注釋,遷移至數(shù)據(jù)庫的備注。先決條件:
1、實體類所在程序集,需要開啟 xml 文檔功能;
2、xml 文件必須與程序集同目錄,且文件名:xxx.dll -> xxx.xml;
手工同步實體結(jié)構(gòu)
提供接口方法實現(xiàn)對比實體,與數(shù)據(jù)庫中的變化部分,返回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;提供接口方法實現(xiàn)同步結(jié)構(gòu)
var t2 = fsql.CodeFirst.SyncStructure<Topic>(); //同步實體類型到數(shù)據(jù)庫實體特性
指定實體的表名,指定 Name 后,實體類名變化不影響數(shù)據(jù)庫對應(yīng)的表。FreeSql盡量支持了對多數(shù)據(jù)庫或schema支持,不防試試指定表名為:其他數(shù)據(jù)庫.表名,不同數(shù)據(jù)庫的指定方式有差異,這一點以后深入解答。
[Table(Name = "db2.tb_topic111")] class Topic {//... }無指定實體的表名,修改為實體類名。指定數(shù)據(jù)庫舊的表名,修改實體命名時,同時設(shè)置此參數(shù)為修改之前的值,CodeFirst才可以正確修改數(shù)據(jù)庫表;否則將視為【創(chuàng)建新表】。
[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);指定屬性的字段名,這樣指定后,修改實體的屬性名不影響數(shù)據(jù)庫對應(yīng)的列。
[Column(Name = "titl2")] public string Title { get; set; }無指定屬性的字段名,修改為屬性名,指定數(shù)據(jù)庫舊的列名,修改實體屬性命名時,同時設(shè)置此參數(shù)為修改之前的值,CodeFirst才可以正確修改數(shù)據(jù)庫字段;否則將視為【新增字段】。
[Column(OldName = "Title2")] public string Title { get; set; } ALTER TABLE `cccddd`.`Topic2` CHANGE COLUMN `Title2` `Title` VARCHAR(255);系列文章導(dǎo)航
(一)入門
(二)自動遷移實體
(三)實體特性
(四)實體特性 Fluent Api
(五)插入數(shù)據(jù)
(六)批量插入數(shù)據(jù)
(七)插入數(shù)據(jù)時忽略列
(八)插入數(shù)據(jù)時指定列
(九)刪除數(shù)據(jù)
(十)更新數(shù)據(jù)
(十一)更新數(shù)據(jù) Where
(十二)更新數(shù)據(jù)時指定列
(十三)更新數(shù)據(jù)時忽略列
(十四)批量更新數(shù)據(jù)
(十五)查詢數(shù)據(jù)
(十六)分頁查詢
(十七)聯(lián)表查詢
(十八)導(dǎo)航屬性
(十九)多表查詢
(二十)多表查詢 WhereCascade
(二十一)查詢返回數(shù)據(jù)
(二十二)Dto 映射查詢
(二十三)分組、聚合
(二十四)Linq To Sql 語法使用介紹
(二十五)延時加載
(二十六)貪婪加載 Include、IncludeMany、Dto、ToList
(二十七)將已寫好的 SQL 語句,與實體類映射進行二次查詢
(二十八)事務(wù)
(二十九)Lambda 表達式
(三十)讀寫分離
(三十一)分區(qū)分表
(三十二)Aop
(三十三)CodeFirst 類型映射
(三十四)CodeFirst 遷移說明
(三十五)CodeFirst 自定義特性
轉(zhuǎn)載于:https://www.cnblogs.com/FreeSql/p/11531550.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的FreeSql (三十四)CodeFirst 迁移说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Visual Studio 2008 断
- 下一篇: C#中的DBNull、Null、和Str