FreeSql (三十四)CodeFirst 遷移說明

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 自定義特性

轉載于:https://www.cnblogs.com/FreeSql/p/11531550.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447709.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447709.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447709.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

曾國藩家訓:三個地方看一個家庭的興敗

第一看&#xff1a;看子孫睡到幾點&#xff0c;假如睡到太陽都已經升得很高的時候才起來&#xff0c;那代表這個家族會慢慢懈怠下來;第二看&#xff1a;看子孫有沒有做家務&#xff0c;因為勤勞、勞動的習慣影響一個人一輩子;第三看&#xff1a;看后代子孫有沒有在讀圣賢的經典…

Linux 查看文件指定行數 內容

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1、tail date.log 輸出文件末尾的內容&#xff0c;默認10行 tail -20 date.log 輸出最后20行的內容 tail -n -20…

FreeSql (三十五)CodeFirst 自定義特性

比如項目內已經使用了其它 orm&#xff0c;如 efcore&#xff0c;這樣意味著實體中可能存在 [Key]&#xff0c;但它與 FreeSql [Column(IsPrimary true] 不同。 Q&#xff1a; FreeSql 實體特性為啥這么別扭&#xff1f; A&#xff1a; 為了考慮一致性用法&#xff0c;全部封裝…

相隨心轉,枯榮立現

宋朝時&#xff0c;有高孝標和高孝積兩個雙胞胎兄弟&#xff0c;舉止言談和才思穎悟都象同一人。十六歲時&#xff0c;他們一齊考上秀才。婚后&#xff0c;父母為使媳婦能辨認丈夫&#xff0c;命令他們穿著不同衣裳和鞋子&#xff0c;以便辨認。有一天&#xff0c;他們遇到陳希…

查看 linux 硬件信息:內存、分區、系統、環境變量、防火墻、路由、端口監聽、進程、CPU...

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、linux CPU大小&#xff1b; 其實應該通過Physical Processor ID來區分單核和雙核。而Physical Processor ID可以從cpuinfo或者dmesg…

成功人士高效率的工作法

現在的人總是忙個不停&#xff0c;尤其企業家或高階主管大多身兼數職&#xff0c;為了達成工作目標&#xff0c;不得不經常加班。加上現在社交媒體和各種電子產品的誘惑讓時間更加不夠用了。每天察看郵件并即時回覆并不代表工作效率。如何排除干擾、克服惰性和避免超時工作才是…

R語言 線性回歸分析實例

y,X1,X2,X3 分別表示第 t 年各項稅收收入(億元)&#xff0c;某國生產總值GDP(億元)&#xff0c;財政支出(億元)和商品零售價格指數(%). (1) 建立線性模型&#xff1a; ① 自己編寫函數&#xff1a; > library(openxlsx) > data read.xlsx("22_data.xlsx",shee…

maven 工程 pom.xml 中 relativePath 的作用

Maven parent.relativePath 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 默認值為../pom.xml 查找順序&#xff1a;relativePath元素中的地址–本地倉庫–遠程倉庫 設定一個空值將…

【Cef編譯】 CefSharp編譯失敗,檢測到“RuntimeLibrary”的不匹配項: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”...

編譯CefSharp生成后一個libcef_dll_wrapper.lib時&#xff0c;供CefSharp使用。結果CefSharp編譯的時候報錯。遇到以下異常&#xff1a;libcef_dll_wrapper.lib(binary_value_ctocpp.obj) : error LNK2038: 檢測到“RuntimeLibrary”的不匹配項: 值“MT_StaticRelease”不匹配值…

做老板欣賞的優秀員工 十大準則你達標嗎?

在一個企業里&#xff0c;什么樣的員工才是優秀的員工&#xff1f;優秀的員工擁有的怎樣的特質&#xff1f;同在一個公司工作&#xff0c;同樣的學歷與相仿的年齡&#xff0c;為什么有的人總是業績更好、工資更高、待遇更優秀、更能夠獲得老板的信任&#xff1f;這是目前許多企…

2 小時學會 springboot ( 附實例講解 )

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一.什么是spring boot Takes an opinionated view of building production-ready Spring applications. Spring Boot favors convention…

管理拾穗:四眼原則

日前聽到一位現在服務于一家德國公司的朋友提及他們公司里的主管有一個四眼原則(Four eyes principle)&#xff0c;意思是如果有一份對外的重要文件要發出前&#xff0c;要經過兩個人(四個眼睛)看過&#xff0c;確定內容無誤之后&#xff0c;再發出。我也曾經在一家國際知名的德…

CEF編譯 執行gn args out\Release_GN_x86異常

gn args out\Debug_GN_x86 用來配置編譯參數&#xff0c;執行gn args out\Release_GN_x86時異常&#xff1a; Toolchain is out of date. Run "gclient runhooks" to update the toolchain, or set DEPOT_TOOLS_WIN_TOOLCHAIN0 to use the locally installed toolcha…

成功者刻骨銘心的一句話

您知道嗎&#xff1f;在這個世界上有許多名人和飛黃騰達的企業家。他們的成功除了靠自己的努力外&#xff0c;還靠來自他人的啟發&#xff0c;改變了他們的觀點&#xff0c;因而攀上了人生的巔峰。就像美國著名顧問公司蓋洛普&#xff08;Gallup&#xff09;的CEO吉姆?克利夫頓…

js中的鼠標右鍵點擊事件

https://www.cnblogs.com/sea-stream/p/9638870.html window.onload function(){//去掉默認的contextmenu事件&#xff0c;否則會和右鍵事件同時出現。document.oncontextmenu function(e){e.preventDefault();};document.getElementById("test").onmousedown fun…

拜托!面試請不要再問我 Spring Cloud 底層原理 ...

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 >出處&#xff1a; >https://www.fangzhipeng.com > 本文出自[方志朋的博客](http://blog.csdn.net/forezp) 本文為轉載文章&…

Django ORM 知識點總結

Query是如何工作的 Django QuerySet是懶執行的&#xff0c;只有訪問到對應數據的時候&#xff0c;才會去訪問數據庫。另外如果你再次讀取查詢到的數據&#xff0c;將不會觸發數據庫的訪問&#xff0c;而是直接從緩存獲取。 比如 # 這里不會訪問數據庫&#xff0c;origins只是一…

22天養成好習慣,一年后脫胎換骨!

第一個習慣&#xff1a; 每天對鏡子的自己微笑。 親愛的&#xff0c;如果你都不喜歡自己的話&#xff0c;怎么可能指望別人喜歡你&#xff1f; 第二個習慣&#xff1a; 每天用涼水洗臉。 涼水洗臉&#xff0c;皮膚健康&#xff1b;熱水洗腳&#xff0c;強似吃藥。 第三個習…

springCloud - 第1篇 - 服務的注冊 Eureka

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 PS&#xff1a;這個系列不定時更新&#xff0c;只是個人的學習分享&#xff0c; 內容全程參考書目&#xff1a; 《Spring Cloud 與 Do…

js中的Map對象

var map new Map();//map對象中添加鍵值對map.set("name","tom");map.set("age",35);map.set("sex",0);//獲取map對象中的值map.get("name")//tom//遍歷map 函數中第一個參數是value&#xff0c;第二個參數是keymap.forEa…