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

您的位置:首頁技術(shù)文章
文章詳情頁

關(guān)于EF的Code First的使用以及踩坑記錄

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

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

1. Entity Framework的簡(jiǎn)介

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

它嚴(yán)格來說是由三種編程方式:

  • 第一種是 "DB First",指的是數(shù)據(jù)庫優(yōu)先,根據(jù)數(shù)據(jù)庫取映射實(shí)體
  • 第二種是“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” 命令

安裝成功后,開始寫代碼

首先我們先新建幾個(gè)實(shí)體類“Student”和“SysClass”,一個(gè)學(xué)生類一個(gè)班級(jí)類,因?yàn)閏lass

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

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

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

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

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

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

然后我們?cè)谥该魑覀冃枰褂玫腁ccountContext 和AccountInitialzer ,向程序指明我們新建創(chuàng)建數(shù)據(jù)庫時(shí),需要使用的類。

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

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

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

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

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

3.EF的一些坑

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

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

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

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

EF的緩存機(jī)制

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

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

我們?cè)俅涡薷拇a,我們都只是查詢主鍵是1的學(xué)生,只不過是換了一種方式,我們?cè)诓榭慈罩尽?/p>

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

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

Attach的使用

我們修改一下代碼:

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

這里就要說明一下了,這里我們使用的是兩個(gè)AccountContext對(duì)象,context對(duì)象查詢出了學(xué)生student,context對(duì)象便開始監(jiān)管這個(gè)對(duì)象,我們用context1這個(gè)對(duì)象修改是,因?yàn)閏ontext1這個(gè)對(duì)象,根本就不知道student是誰,當(dāng)然會(huì)修改失敗了。

這樣我們?cè)谛薷囊幌麓a:

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

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

需要注意的是如果被修改的對(duì)象的屬性在Attach之前,會(huì)修改失敗的,因?yàn)槟菚r(shí)候,context1還沒有對(duì)student進(jìn)行監(jiān)管。

比如這樣,就會(huì)修改失敗,

按需修改

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

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

AsNoTracking的使用

我們?cè)俅涡薷拇a

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

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

標(biāo)簽: ASP.NET
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
成人av二区| 日韩精品1区| 国产不卡精品在线| 亚洲第一精品影视| 精品少妇一区| 奇米色欧美一区二区三区| 极品日韩av| www在线观看黄色| 亚洲欧美日本视频在线观看| 日韩国产欧美| 久久丁香四色| 中文字幕成人| 亚洲国产专区| 日韩久久精品网| 久久精品免费看| 欧美日本精品| 人人精品久久| 女人天堂亚洲aⅴ在线观看| 国产一区二区三区久久| 日本少妇一区二区| 日韩中文字幕区一区有砖一区| 国产福利片在线观看| 国产精品4hu.www| 91九色精品| 国产麻豆综合| 亚洲理论在线| 亚洲人成毛片在线播放女女| 亚洲精品综合| 国产日韩精品视频一区二区三区| 91综合久久爱com| 视频一区中文字幕精品| 视频一区中文字幕精品| 亚洲一区二区日韩| 青草av.久久免费一区| 国产欧美在线| 国产精品毛片久久| 国产福利电影在线播放| 肉色欧美久久久久久久免费看 | 国产精品xxx| 国产专区精品| 日本国产精品| 日韩一区欧美二区| 国产精品欧美三级在线观看 | 亚洲日本三级| 国产精品99精品一区二区三区∴| 成人一区而且| 日韩天堂av| 亚洲v天堂v手机在线| 久久这里只有精品一区二区| 精品亚洲美女网站| 日韩二区在线观看| 欧美sm一区| 亚洲欧洲一区| 日本综合字幕| 国产精品.xx视频.xxtv| 久久九九精品| 国产精品一区毛片| 国产精品色网| 国产aa精品| 欧美综合社区国产| 首页国产欧美日韩丝袜| 成人一二三区| 亚州av一区| 亚洲高清影视| 久草免费在线视频| 国产精品腿扒开做爽爽爽挤奶网站| 麻豆精品91| 国产欧美午夜| 黄色欧美日韩| 精品女同一区二区三区在线观看| 999精品在线| 人人精品亚洲| 亚洲1234区| 国产精品久久久久久久久久10秀| 精品伊人久久久| 免费成人在线视频观看| 国产成人精品亚洲线观看 | 老鸭窝一区二区久久精品| 红桃视频国产一区| 毛片在线网站| 欧美aa一级| 久久一级电影| 在线 亚洲欧美在线综合一区| 99久久亚洲精品蜜臀| 麻豆精品在线播放| 欧美国产另类| 在线人成日本视频| 欧美日韩在线播放视频| 久久久久网站| 伊人久久av| 伊伊综合在线| 欧美日韩国产一区二区三区不卡| 亚洲激情久久| 人人爱人人干婷婷丁香亚洲| 国产精品nxnn| 三上悠亚国产精品一区二区三区| 一区二区小说| 日本伊人午夜精品| 四虎精品永久免费| 日韩精彩视频在线观看| 97精品在线| 欧美伊人久久| 美女尤物久久精品| 日韩成人高清| 国产一卡不卡| 国产精品日韩久久久| 国产 日韩 欧美一区| 欧美天堂在线| 蜜桃传媒麻豆第一区在线观看| 天堂√8在线中文| 国产激情一区| 91嫩草精品| 亚洲丝袜啪啪| 西西人体一区二区| 女人天堂亚洲aⅴ在线观看| 92国产精品| 色欧美自拍视频| 国产中文字幕一区二区三区| 日本色综合中文字幕| 免费国产亚洲视频| 午夜日韩av| 在线精品视频在线观看高清| 久久精品一区二区不卡| а√天堂中文在线资源8| 成人台湾亚洲精品一区二区| 精品国产黄a∨片高清在线| 麻豆精品99| 成人福利视频| 日韩一区电影| 在线成人动漫av| 一区在线观看| 日韩**一区毛片| 国产精品一国产精品| 国产黄色一区| 成人精品视频| 国产在线不卡| 视频精品一区| 久久中文字幕一区二区| 最近高清中文在线字幕在线观看1| 黑人精品一区| 亚洲中午字幕| 国产精品啊v在线| 天堂av在线| 蜜桃一区二区三区在线| 国产欧美日韩影院| 国产一区亚洲| 日本午夜精品久久久| 久久久久久网| 伊人国产精品| 老鸭窝一区二区久久精品| 日韩精品诱惑一区?区三区| 99视频+国产日韩欧美| 国产精品xxxav免费视频| 久久国产小视频| 国产午夜精品一区在线观看| 97国产精品| 青青国产精品| 欧美日韩一二三四| 日韩欧美2区| 久久在线视频免费观看| 国产图片一区| 久热综合在线亚洲精品| 免费在线观看一区| 视频一区二区三区在线| 国产福利91精品一区二区| 视频在线观看一区二区三区| 国产不卡精品| 国产麻豆一区二区三区| 亚洲视频www| 欧美香蕉视频| 国产精品mv在线观看| 亚欧洲精品视频在线观看| 国产一在线精品一区在线观看| 欧美精品国产| 久色成人在线| 国产精品日韩久久久| 日韩欧美字幕| 精品国产麻豆| 精品国产午夜肉伦伦影院| 中文字幕亚洲精品乱码| 最新中文字幕在线播放| 久久精品国产在热久久| 久久国际精品| 日韩高清在线不卡| 日韩欧美中文字幕在线视频| 免费在线观看日韩欧美| 午夜av一区| 国产精品普通话对白| 亚洲一卡久久| 蜜桃一区二区三区在线观看| 蘑菇福利视频一区播放| 亚洲自啪免费| 中文字幕日本一区二区| 蜜臀久久99精品久久久久久9 | 欧美日韩亚洲一区二区三区在线| 日韩中文字幕不卡| 亚洲欧美一级| 欧美亚洲tv| 国产成人精品一区二区免费看京| 精品三级av|