成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

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

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

1. Entity Framework的簡介

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

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

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

2.Code First的使用

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

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

安裝成功后,開始寫代碼

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

在.net中是保留字,所以我們為班級類起名“SysClass”,但是“Class”在數據庫中不是保留字多以我們可以怎樣做在“SysClass”類上打上特性**[Table(“Class”)]**,然后在其他字段上添加幾個必要的屬性,“SysClass”的Students屬性上有個virtual,指明這個是外鍵。

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

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

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

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

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

然后我們在指明我們需要使用的AccountContext 和AccountInitialzer ,向程序指明我們新建創建數據庫時,需要使用的類。

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

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

運行程序后,我們發現程序運行正常

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

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

3.EF的一些坑

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

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

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

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

EF的緩存機制

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

我們查看日志,發現只生成了一條sql。

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

這里我們發現,它生成了兩條相同的sql

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

Attach的使用

我們修改一下代碼:

我們先查詢一個學生,然后在修改它的Name屬性,然后保存,這里result返回的是0,意思是沒有執行成功,我們查看數據庫發現確實沒有修改成功。

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

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

我們發現返回的是1,當在查看數據庫時,發現數據庫的信息被修改了。

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

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

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

按需修改

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

查看日志,發現只修改了Name屬性,

AsNoTracking的使用

我們再次修改代碼

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

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

標簽: ASP.NET
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲成av人片在线观看无码| 蜜臀av一区二区在线免费观看 | 久久久久天天天天| 国产精品理论片在线观看| 成人精品视频一区二区三区| 91精品久久久久久久91蜜桃| 久久精品久久精品| 久久裸体视频| 五月天视频一区| 性xx色xx综合久久久xx| 一区二区三区高清在线| 亚洲精品精选| 一区在线观看视频| 一区二区在线不卡| 国产精品传媒视频| 黄色一区三区| 国产精品麻豆网站| 影音先锋国产精品| 亚洲欧美色一区| 9国产精品视频| 亚洲在线观看免费视频| 国产精品亚洲欧美| 亚洲一二三四在线观看| 亚洲综合日本| 天堂av在线一区| 日本韩国一区二区三区| 蜜桃av一区二区| 欧美人狂配大交3d怪物一区 | 精品91在线| 亚洲视频在线一区二区| 亚洲图片在线| 亚洲女同女同女同女同女同69| 亚洲国产激情| 一区二区三区 在线观看视频| 国产日韩欧美一区二区| 日韩精品成人一区二区三区| 欧美亚洲精品一区| 精品一区二区在线播放| 欧美一区中文字幕| 丁香激情综合国产| 精品国产一区二区三区四区四| 成人18精品视频| 久久综合狠狠综合久久激情| 欧美在线视频二区| 中文字幕在线观看不卡| 国一区二区在线观看| 亚洲伦理在线免费看| 亚洲一区图片| 日韩黄色免费电影| 欧美日韩国产高清一区二区| 成人av在线看| 日本一二三不卡| 国产日本精品| 天堂成人国产精品一区| 91精品国产综合久久久久| 91性感美女视频| 国产精品国产三级国产普通话三级| 91久久国产自产拍夜夜嗨| 香港成人在线视频| 欧美日韩免费一区二区三区| 成人动漫视频在线| 亚洲品质自拍视频网站| 欧美专区在线观看一区| 国产精品一区二区不卡| 国产视频不卡一区| 国产亚洲精品自拍| 精品一区精品二区高清| 久久久久久夜精品精品免费| 亚洲精品麻豆| 久久99久久99精品免视看婷婷| 欧美成人一区二区三区片免费| 激情成人综合| 免费人成网站在线观看欧美高清| 日韩一二三区不卡| 亚洲午夜久久久久久尤物| 亚洲午夜久久久久久久久久久| 欧美日韩美女一区二区| 99精品国产91久久久久久| 亚洲精品中文在线影院| 色呦呦网站一区| 成人精品鲁一区一区二区| 日本一区二区免费在线| 久久成人在线| 丁香婷婷综合色啪| 一区二区三区四区五区视频在线观看 | 亚洲福利视频导航| 欧美一区二区三区四区视频 | 亚洲精品社区| 国产一区二区三区在线观看精品 | 精品国产99国产精品| 中文精品视频一区二区在线观看| 国产一区在线观看麻豆| 国产精品美女久久久久aⅴ国产馆| 久久久国产精品一区二区三区| bt7086福利一区国产| 一区二区三区欧美| 日韩一级片在线观看| 日韩香蕉视频| 国产91露脸合集magnet| 艳妇臀荡乳欲伦亚洲一区| 欧美sm极限捆绑bd| 亚洲日本久久| 国产福利不卡视频| 亚洲精品成人悠悠色影视| 欧美一区二区日韩一区二区| 合欧美一区二区三区| 国产一区二区h| 中文亚洲免费| 在线观看欧美黄色| 中文字幕一区av| 国产精品资源在线看| 老司机精品视频网站| 中文字幕免费不卡在线| 激情深爱一区二区| 亚洲欧美网站| 亚洲男人的天堂在线观看| 99国产精品久久久久久久久久久 | 亚洲免费av网站| 欧美在线高清| 91精品国产综合久久精品| 婷婷一区二区三区| 亚洲美女91| 亚洲欧洲日韩综合一区二区| 成人午夜免费av| 欧美日韩中文字幕一区二区| 一区二区久久久| 欧美阿v一级看视频| 日韩亚洲国产中文字幕欧美| 午夜精品久久久久久不卡8050| 亚洲国产精品久久久久婷婷老年| 亚洲国产精品精华液ab| 91免费视频网| 久久精品无码一区二区三区| 成人精品免费看| 日韩欧美视频一区| 成人性生交大合| 欧美一级黄色大片| 国产一区二区精品久久| 欧美日韩mp4| 国产伦精品一区二区三区免费| 欧美最猛黑人xxxxx猛交| 婷婷开心久久网| 久久久精彩视频| 午夜视频一区二区| 午夜在线视频观看日韩17c| 自拍偷拍亚洲综合| av中文字幕在线不卡| 日韩精品在线一区| 北岛玲一区二区三区四区| 91麻豆蜜桃一区二区三区| 日韩欧美国产精品| 91香蕉国产在线观看软件| 国产亚洲一区二区三区四区 | 欧美色网站导航| 国产成人精品一区二区三区网站观看| 91精品国产综合久久福利软件| 国产精品18久久久久久久久| 精品国产成人在线影院| 欧美日本中文| 亚洲三级在线免费| 色婷婷久久综合| 国产一区二区不卡老阿姨| 精品日韩一区二区三区| 精品二区久久| 麻豆精品一区二区综合av| 日韩一级免费一区| 99精品在线免费| 亚洲国产精品自拍| 欧美日韩一区二区三区四区 | 成人av在线看| 最好看的中文字幕久久| 色av成人天堂桃色av| 久久丁香综合五月国产三级网站| 精品免费国产二区三区| 午夜激情一区| 中文字幕一区免费在线观看| 蜜桃av综合| 成人免费av在线| 亚洲精品久久久蜜桃| 欧美一区二区性放荡片| 夜夜爽av福利精品导航| 国产乱人伦精品一区二区在线观看| 欧美国产激情一区二区三区蜜月| 夜夜嗨av一区二区三区网站四季av| 美女任你摸久久 | 日韩av中文字幕一区二区 | 国产精品一区二区三区乱码| 亚洲人成7777| 日韩欧美综合在线| 亚洲伦伦在线| 久久精品久久精品| 欧美高清在线精品一区| 国产精品久久777777毛茸茸| 九色综合国产一区二区三区| 亚洲欧美日本韩国| 欧美亚洲高清一区| 亚洲国产精品www| 精品在线免费观看| 国产精品免费看片| 日韩一级成人av|