日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

關于EF的Code First的使用以及踩坑記錄

瀏覽:362日期:2022-06-09 10:53:38
目錄
  • 1. Entity Framework的簡介
  • 2.Code First的使用
  • 3.EF的一些坑
    • EF的緩存機制
    • Attach的使用
    • 按需修改
    • AsNoTracking的使用

最近公司需要使用EF(Entity Framework)的CodeFirst,雖然之前接觸過EF的使用,但是卻從來沒有使用過CodeFirst,所以便從網(wǎng)上和其他地方學習了一下,所以在此記錄一下, 以便以后忘記的時候,可以回顧一下。

1. Entity Framework的簡介

Entity Framework是一種數(shù)據(jù)庫的持久化框架,是微軟開發(fā)的基于ADO.NET的ORM(Object Relational Mapping,對象關系映射)框架

它嚴格來說是由三種編程方式:

  • 第一種是 "DB First",指的是數(shù)據(jù)庫優(yōu)先,根據(jù)數(shù)據(jù)庫取映射實體
  • 第二種是“Model First”指的是模型優(yōu)先,根據(jù)模型取生成數(shù)據(jù)庫中的表,
  • 第三種是“Code First”指的是代碼優(yōu)先,根據(jù)代碼去生成數(shù)據(jù)庫中的表,還有另外一種是來自數(shù)據(jù)庫的“Code First”

2.Code First的使用

按照下面的操作安裝EF的最新版本

然后輸入“install-package entityframework” 命令

安裝成功后,開始寫代碼

首先我們先新建幾個實體類“Student”和“SysClass”,一個學生類一個班級類,因為class

在.net中是保留字,所以我們?yōu)榘嗉夘惼鹈?ldquo;SysClass”,但是“Class”在數(shù)據(jù)庫中不是保留字多以我們可以怎樣做在“SysClass”類上打上特性**[Table(“Class”)]**,然后在其他字段上添加幾個必要的屬性,“SysClass”的Students屬性上有個virtual,指明這個是外鍵。

然后再新建一個“AccountContext”類這個類,繼承自"DBContext"(System.Data.Entity) 這個類封裝了對數(shù)據(jù)庫的一些配置和釋放,當然CRUD(增刪改查)也可以通過這個類來實現(xiàn)。

實現(xiàn)父類的構造函數(shù),傳入的參數(shù)是nameof(AccountContext),指明的是使用哪個的數(shù)據(jù)庫的連接串,OnModelCreating()這個方法可以重寫也可以不重寫,這個方法主要是為了指明是否需要在將代碼映射到數(shù)據(jù)庫時,是否生成復數(shù)的表名,默認情況下是自動生成復數(shù)的表名。

然后在新建一個“AccountInitialzer”類,用來初始化數(shù)據(jù)庫的,他繼承自“DropCreateDatabaseIfModelChanges”,表明是當實體改變時,刪除數(shù)據(jù)庫中的表,然后在根據(jù)代碼映射的實體新建數(shù)據(jù)庫中的表,然后重寫它的Seed方法,

這個方法是當數(shù)據(jù)庫初始化的時候,插入一些測試的數(shù)據(jù),它還有可以繼承DropCreateDatabaseAlways,但是這種方法比較狠,每次都會從刪除數(shù)據(jù)庫中的表,在根據(jù)代碼去重新生成數(shù)據(jù)庫,不介意使用,需要注意的是Seek這個方法,不是運行程序都會執(zhí)行的,他只在第一次創(chuàng)建數(shù)據(jù)庫會被執(zhí)行,或者當數(shù)據(jù)庫中的表和代碼映射的實體不一致時,他也會執(zhí)行。

最后我們開始配置數(shù)據(jù)庫的連接串 name 指的是數(shù)據(jù)庫連接串的名字 也是我們“AccountContext”的類傳入的參數(shù), initial catalog 是創(chuàng)建的數(shù)據(jù)庫的名字,我們這里不指明創(chuàng)建的數(shù)據(jù)庫的位置,當然也可以指明創(chuàng)建的數(shù)據(jù)庫位置,不指明的他會在你數(shù)據(jù)庫的文件夾中創(chuàng)建新的數(shù)據(jù)庫,還有就是 providerName=“System.Data.SqlClient” 這個一定要帶上,否則可能會出錯。

然后我們在指明我們需要使用的AccountContext 和AccountInitialzer ,向程序指明我們新建創(chuàng)建數(shù)據(jù)庫時,需要使用的類。

注意type里面配置的是程序集的名稱,而不是命名空間的名稱,還有就是disableDatabaseInitialization這個參數(shù),false是指明啟用這個配置,true這是禁用。

然后我們在控制臺繼續(xù)敲代碼,這里的Using語法,說明一下我們對DBcontext這個類查看定義發(fā)現(xiàn),這個類是實現(xiàn)了IDisposable接口,這就意味著,它是可以被釋放的托管資源,避免內(nèi)存越占越多,造成的程序性能的較低,同時這也是一個好的編程習慣。

運行程序后,我們發(fā)現(xiàn)程序運行正常

我們在檢查一下數(shù)據(jù)庫,win+r 輸入命令 ssms 打開數(shù)據(jù)庫發(fā)現(xiàn),數(shù)據(jù)庫也被正常創(chuàng)建了,這里說明一下,這里除了生成了我們需要的表以外,還生成了表“dbo__MigrationHistory”,這個表是記錄數(shù)據(jù)庫遷移使用的,以后再做說明,每次數(shù)據(jù)庫表結構的更新,都會在這里存下數(shù)據(jù)。

這樣我們的Code First就完成了。

3.EF的一些坑

看了上面的文章是不是覺得CodeFirst還是很簡單的,通過是用EF 我們甚至不再需要學習數(shù)據(jù)庫的一些知識,甚至可以讓我們不再關心數(shù)據(jù)庫內(nèi)部的實現(xiàn),只需要我們修改代碼,便可以修改掉數(shù)據(jù)庫中的表結構,Code First用的好,我們甚至都不必去打開一次數(shù)據(jù)庫。

但是EF看著好用,其實它內(nèi)部的坑或者或一些比較讓人忽略的東西還是有不少的。

我們重新改造一下控制臺的代碼,添加 context.Database.Log +=c=> Console.WriteLine©; 這句話會幫我們記錄數(shù)據(jù)的日志。

我們執(zhí)行查詢操作 發(fā)現(xiàn)控制臺多了許多代碼,這就是數(shù)據(jù)庫的日志,當然,我們看到的這條sql語句,就是我們執(zhí)行 var student = context.Student.Find(1); 這句話時,生成的sql語句,是不是用起來很方便,但是我們只需要查詢主鍵是1的數(shù)據(jù),他卻給我們生成了這么長的一條sql語句,是不是看起來感覺EF其實也笨笨的,所以這就是EF不適合大型項目的原因。

EF的緩存機制

我們輸入這樣的代碼,兩次查詢主鍵是1的學生

我們查看日志,發(fā)現(xiàn)只生成了一條sql。

我們再次修改代碼,我們都只是查詢主鍵是1的學生,只不過是換了一種方式,我們在查看日志。

這里我們發(fā)現(xiàn),它生成了兩條相同的sql

這里我們發(fā)現(xiàn),find會優(yōu)先去緩存中去查詢數(shù)據(jù),而where則會每次都會生成新的sql去執(zhí)行查詢,就算查詢條件相同,where也會生成新的sql。所以where可以保證我們每次都能取到最新的數(shù)據(jù),而find則不行,之所以出現(xiàn)這種情況,我是這么理解的,find查詢的數(shù)據(jù)的每次都只能返回一條,數(shù)據(jù)量小,不會占用太多的內(nèi)存,但是where我們發(fā)現(xiàn)返回的是IQueryable類型的數(shù)據(jù),這樣就不能保證返回的數(shù)據(jù)量小了,因此為了性能的這個就不會放到緩存中去了。

Attach的使用

我們修改一下代碼:

我們先查詢一個學生,然后在修改它的Name屬性,然后保存,這里result返回的是0,意思是沒有執(zhí)行成功,我們查看數(shù)據(jù)庫發(fā)現(xiàn)確實沒有修改成功。

這里就要說明一下了,這里我們使用的是兩個AccountContext對象,context對象查詢出了學生student,context對象便開始監(jiān)管這個對象,我們用context1這個對象修改是,因為context1這個對象,根本就不知道student是誰,當然會修改失敗了。

這樣我們在修改一下代碼:

我們發(fā)現(xiàn)返回的是1,當在查看數(shù)據(jù)庫時,發(fā)現(xiàn)數(shù)據(jù)庫的信息被修改了。

Attach是將查出來的student讓context1進行監(jiān)管,就相當于與這個student對象是被context1查出來的一樣,但也是有區(qū)別的,所以我們就修改成功了。

需要注意的是如果被修改的對象的屬性在Attach之前,會修改失敗的,因為那時候,context1還沒有對student進行監(jiān)管。

比如這樣,就會修改失敗,

按需修改

EF是支持按需修改的,我們修改代碼:

查看日志,發(fā)現(xiàn)只修改了Name屬性,

AsNoTracking的使用

我們再次修改代碼

我們在查詢到的數(shù)據(jù)中添加AsNoTracking()的方法,再次修改實體,發(fā)現(xiàn)修改失敗了,這里解釋一下AsNoTracking()這個方法,他表示不再追蹤這條數(shù)據(jù),也就是context這個對象不再監(jiān)管oldstudent這個對象,所以會修改失敗的,雖然一定程度上可以提高性能,但是介意不要使用。

好了,本篇文章就到此為止了。以后再介紹EF的其他知識點。以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持。

標簽: ASP.NET
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
三级小说欧洲区亚洲区| 欧美一级久久| 老司机精品在线| 亚洲制服一区| 亚洲尤物在线| 久久大逼视频| 亚洲综合色婷婷在线观看| 日本欧洲一区二区| 免费美女久久99| 亚洲久久视频| 91精品麻豆| 日韩欧乱色一区二区三区在线| 在线精品福利| 亚洲三级网址| 国产人成精品一区二区三| 国产九九精品| 久久久91麻豆精品国产一区| 精品精品久久| 日韩精品免费一区二区在线观看| 久久三级福利| 99精品99| 日韩av中文字幕一区| 国产精品1区| 五月天av在线| 91精品蜜臀一区二区三区在线| 91精品国产调教在线观看| 午夜国产精品视频免费体验区| 婷婷成人基地| 日韩一区免费| 精品视频高潮| 在线成人动漫av| 自拍自偷一区二区三区| 国产精品香蕉| 精品国产一级| 亚洲精品一区二区在线看| 蜜桃视频一区二区| 国产欧美日韩精品一区二区免费| 91日韩在线| 国产精品婷婷| 日韩精品一级| 国产美女高潮在线| 免费精品国产的网站免费观看| 手机精品视频在线观看| 欧美另类中文字幕 | 视频一区免费在线观看| 香蕉久久一区| 天堂8中文在线最新版在线| 羞羞答答国产精品www一本| 国产日韩欧美三区| 日本国产精品| 日韩午夜视频在线| 色婷婷色综合| 欧美精品黄色| 久久av日韩| 99国产一区| 精品国产一区二区三区噜噜噜| 极品日韩av| 国产乱码精品一区二区三区亚洲人 | 久久av影院| 久久一级电影| 91成人在线| av日韩中文| 最新国产精品久久久| 伊人久久av| 亚洲美女久久| 久久精品青草| 国产精品日韩精品在线播放| 好吊一区二区三区| 国产精品传媒麻豆hd| 一区视频在线| 精品国产aⅴ| 日日摸夜夜添夜夜添国产精品| 成人日韩在线| 国产乱子精品一区二区在线观看| 亚洲免费播放| 日本久久精品| 中文字幕亚洲精品乱码| 成人免费网站www网站高清| 国产午夜久久av| 亚洲一区二区三区四区五区午夜| 欧美一区二区三区久久| 99视频精品免费观看| 高清av不卡| 国产精品对白| 日韩美女精品| 噜噜噜躁狠狠躁狠狠精品视频 | 国产综合欧美| 国产在线不卡一区二区三区| 色综合视频一区二区三区日韩| 91精品xxx在线观看| 欧美日韩中出| 天堂俺去俺来也www久久婷婷| 欧美福利一区| 日韩毛片视频| 国产精品theporn| 亚洲精品乱码日韩| 美女尤物久久精品| 美女毛片一区二区三区四区| 亚洲成人一区在线观看| 精品久久久中文字幕| 国产欧美高清视频在线| 日韩1区2区3区| 亚洲精品乱码久久久久久蜜桃麻豆| 99视频一区| 久久免费黄色| 日韩在线免费| 成人日韩精品| 视频福利一区| 成人va天堂| 蜜桃av.网站在线观看| 福利精品一区| 成人免费一区| 日韩国产欧美在线播放| 亚洲理论在线| 亚洲天堂日韩在线| 免费不卡在线观看| 视频一区中文字幕| 在线免费观看亚洲| 美国欧美日韩国产在线播放| 不卡av一区二区| 日韩精品久久久久久久电影99爱 | 久久视频国产| 不卡在线一区| 99视频+国产日韩欧美| 国产一区91| 免费一级片91| 日韩精品欧美精品| 日韩高清一区在线| 国产午夜一区| 美女免费视频一区| 成人国产综合| 99久久婷婷| 99久久99视频只有精品| 国产二区精品| 蜜桃视频第一区免费观看| 在线视频亚洲欧美中文| 日韩一区二区三区免费视频| 日本精品在线播放| 麻豆精品少妇| 日韩综合精品| 狠狠干成人综合网| 亚洲午夜免费| 国产三级精品三级在线观看国产| 国产精品一区亚洲| 精品三级久久久| 亚洲午夜天堂| 午夜电影亚洲| 亚州精品视频| 国产极品模特精品一二| 91亚洲一区| 亚洲激情欧美| 日韩国产在线一| 97精品中文字幕| 悠悠资源网久久精品| 日韩有吗在线观看| 麻豆91小视频| 精品日韩视频| 久热精品在线| 国产欧美69| 日本高清不卡一区二区三区视频| 国产视频一区在线观看一区免费| 日韩av中文在线观看| 麻豆精品蜜桃视频网站| 91精品精品| 日韩精品a在线观看91| 精品三级在线| 午夜欧美理论片| 欧美日韩夜夜| 日本精品不卡| 亚洲一区区二区| 欧美国产专区| 激情久久久久久久| 日韩av一区二区在线影视| 精品亚洲二区| 在线视频免费在线观看一区二区| 日韩国产在线观看| 成人亚洲欧美| 噜噜噜久久亚洲精品国产品小说| 欧美欧美黄在线二区| 天堂8中文在线最新版在线| 蜜臀久久久久久久| 成人在线黄色| 在线午夜精品| 麻豆视频久久| 日韩天堂av| 国产精品99精品一区二区三区∴| 欧美日韩中文字幕一区二区三区| 一本一道久久a久久| 福利一区和二区| 中文字幕一区二区精品区| 国产欧美一区二区三区精品酒店| 一二三区精品| 成人亚洲一区| 亚洲美女91| 亚洲va在线| 国产精品一区二区免费福利视频| 欧美在线亚洲综合一区| 精品久久影院| 日韩高清一区| 精品一区在线|