數(shù)據(jù)庫遷移migrations創(chuàng)建初始模型和_第1頁
數(shù)據(jù)庫遷移migrations創(chuàng)建初始模型和_第2頁
數(shù)據(jù)庫遷移migrations創(chuàng)建初始模型和_第3頁
數(shù)據(jù)庫遷移migrations創(chuàng)建初始模型和_第4頁
數(shù)據(jù)庫遷移migrations創(chuàng)建初始模型和_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

在開始使用遷移(Migrations)之前,我們需要一個Project和一個CodeFirstModel,對于本文將使型的Blog和Post模型 的EntityFramework到項Tools–>LibraryPackageManager–>PackageManagerInstall-PackageBlog.csDbContextpublicclass{publicintBlogId{get;set;publicstringName{get;set;}publicclassBlogContext:{publicDbSet<Blog>Blogs{get;set;}Program.csstaticvoidMain(string[]{using(vardb=new db.Blogs.Add(newBlog{Name="AnotherBlog" foreach(varblogin ine("Pressanykeyto}發(fā)現(xiàn)如上錯誤"CREATEDATABSEpermissiondeniedindatabse我們在BlogContext上的無參構(gòu)造函數(shù)上添加診碼并設(shè)置調(diào)試斷DataScource.\\SQLEXPRESSlocalDB, SQLExpressdatabaselocalSQLExpressinstanceCodeFirst才將嘗試使用localDB; SQLExpress總是具有優(yōu)先權(quán),只要安裝了它 如果想繼續(xù)使用 Express,那么就配置相應(yīng)地權(quán)限,請參考 localDB只需在.config配置即可(configSections節(jié)點后面<addname="BlogContext"connectionString="DataCatalog=BlogContext;IntegratedSecurity=SSPI;" 再次運行就行了,讓我們看一下生成的數(shù)據(jù)BlogUrlpublicstringUrl{get;set;'InvalidOperationException'wasunhandled.Themodelbackingthe'BlogContext'contexthaschangedsincethedatabasewascreated.ConsiderusingCodeFirstMigrationstoupdatethedatabase(http: 正如錯誤消息提示的那樣,是時候使用CodeFirstMigrations,第一步是運行如下令PackageManagerConsoleEnable- TheConfigurationclass這個類允許你去配置如何遷移,對于本文將使用默認(rèn)的配置(在本文中因為只Context,Enable-Migrationscontexttype作出適配); AnInitialCreatemigration(201312240822431_InitialCreate.cs)這個遷移之所以存在是因CodeFirst創(chuàng)建了數(shù)據(jù)庫,在啟用遷移前,scaffoldedmigration里的代碼表示在數(shù)據(jù)庫中已經(jīng).InitialCreatemigrationAdd-Migration的時候所有表都將歸集到一個新的migration中)EF6CodeFirstModel被用來生成/Schema這將導(dǎo)致每個數(shù)據(jù)庫只會有一張MigrationsHistory表,從而無法辨別實體與模型的對應(yīng)關(guān)系。EF6開始,ConfigurationContextKeyCodeFirstModel的唯MigrationsHistory表中一個相應(yīng)地的列允許來自多個模型(multiplemodels)的實體共享表(entries)contextCodeFirstMigrations有兩個你需要熟悉令A(yù)dd-Migrationscaffold創(chuàng)建下一次基于上一次遷移以來的更改的遷移Update-Databse我們需要腳手架(scaffold直譯)UrlAdd-Migration允許我們對遷移命AddBlogUrlPackageManagerConsoleAdd-Migration一個新的遷移(名稱包含timestamp前綴) Migrations中創(chuàng)建成namespace{usingusingpublicpartialclassAddBlogUrl: publicoverridevoid AddColumn("dbo.Blogs","Url",c=> publicoverridevoid DropColumn("dbo.Blogs", }Update-Database來應(yīng)PackageManagerConsoleUpdate-DatabaseAddBlogUrl遷移將會被應(yīng)用到數(shù)據(jù)庫(Blogs到目前為止我們生成并運行了一個遷移,但是沒有對遷移做任何更改,下面嘗試做一些更改:在類Bolg上RatingpublicintRating{get;set;publicclass{publicintPostId{get;set;publicstringTitle{get;set;publicstringContent{get;set;publicintBlogId{get;set;publicBlogBlog{get;set;}BlogPostpublicvirtualICollection<Post>Posts{get;set;PackageManagerConsoleAdd-MigrationViewViewPosts.Title列上增加唯一索引Blogs.Rating列非空,對于表中已經(jīng)存在的數(shù)據(jù),新列都會被賦值成CLR的默認(rèn)數(shù)據(jù)類型namespace{usingusingpublicpartialclassAddPostClass: publicoverridevoid c=> PostId=c.Int(nullable:false,identity: Title=c.String(maxLength: Content= BlogId=c.Int(nullable: .PrimaryKey(t=> .ForeignKey("dbo.Blogs",t=>t.BlogId,cascadeDelete: .Index(t=>.Index(p=>p.Title,unique:AddColumn("dbo.Blogs","Rating",c=>c.Int(nullable:false,defaultValue: publicoverridevoid DropIndex("dbo.Posts",new[]{"Title" DropForeignKey("dbo.Posts","BlogId", DropIndex("dbo.Posts",new[]{"BlogId" DropColumn("dbo.Blogs", }PackageManagerConsoleUpdate-Database/但是我們可以隨意運行SQL。讓我們在Post中增加一個屬 ,稍后我們使用列Content的開頭來填充此列(數(shù)據(jù)庫已有記錄public {get;set;}在PackageManagerConsole中運行命令A(yù)dd-Migration 生成的遷移非常好,但是我們想使用Content的前100個字符來預(yù)填充 namespace{usingusingpublicpartialclass :DbMigration publicoverridevoid AddColumn("dbo.Posts", ",c=>Sql("UPDATESql("UPDATEdbo.Posts=LEFT(Content,100)IS publicoverridevoid DropColumn("dbo.Posts", }PackageManagerConsoleUpdate-Database行AddBlogUrl遷移之后的狀態(tài),此時我們就可以使用–TargetMigration來降級到這個版本PackageManagerConsoleUpdate-Database–TargetMigration andAddPostClass的Down命checkin于本地。但是如果我們想把這些更改推送至測試服務(wù)器或生產(chǎn)服務(wù)器,我們也許需要一份SQL提供給DBA 在運行Update-Database的時候指定-Specify標(biāo)記,我們就能夠使得這些更改被寫入一個 被應(yīng)用,我們同時也會為此指定源遷移和目標(biāo)遷移,例如我們希望產(chǎn)生的是從一個空數(shù)據(jù)庫 遷移將始終更新至版本;如果你沒有指定源遷移,那么遷移將以數(shù)據(jù)庫目前狀態(tài)為初始)在PackageManagerConsole中運行命令Update-Database-Script-$InitialDatabase-TargetMigration:產(chǎn)生的SQL如ViewView從EF6開始,如果你使用–SourceMigration$InitialDatabase,產(chǎn)生的將是冪等的,冪等意味著無論數(shù)據(jù)庫當(dāng)前處于什么版本/狀態(tài),都能升級至版本或指定版本(指定–TargetMigration),生成的包括檢查表MigrationsHistory的邏輯以及只更新之前從未更新的(MigrateDatabaseToLatestVersion初始化可以通過MigrateDatabaseToLatestVersion數(shù)據(jù)庫初始化器來實現(xiàn)這一點,數(shù)據(jù)庫初始化器只包含一些邏輯檢查用于確保數(shù)據(jù)庫被正確設(shè)置,這個邏輯檢查將會在App 的context第一次被使用的時候執(zhí)行。當(dāng)我們創(chuàng)建一個初始化器的實例時,需要指定contexttype(BlogContext)以及migrationsconfiguration(Configuration)-這個遷移配置類是在我們啟用遷移時生成的 usingSystem;usingSystem.Collections.Generi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論