日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Code First 迁移

發布時間:2024/1/17 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Code First 迁移 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本演練將提供對實體框架中 Code First 遷移的概述。您可以完成整個演練,也可以跳至自己感興趣的主題。主題如下:

  • 啟用遷移
  • 生成并運行遷移
  • 自定義遷移
  • 數據移動和自定義 SQL
  • 遷移到特定版本(包括降級)
  • 生成 SQL 腳本
  • 在應用程序啟動時自動升級(MigrateDatabaseToLatestVersion 初始值設定項)

?

構建一個初始模型和數據庫

在我們開始使用遷移之前,需要有一個項目和一個 Code First 模型。對于本次演練任務,我們仍將使用?Blog?和?Post?規范模型。

  • 創建新的?MigrationsDemo?控制臺應用程序
  • 將最新版本的?EntityFramework?NuGet 包添加到項目
    • 工具 –> 庫程序包管理器 –> 程序包管理器控制臺
    • 運行?Install-Package EntityFramework?命令
  • 添加一個包含下面所示代碼的?Model.cs?文件。這段代碼定義一個?Blog?類,該類由我們的域模型和一個作為 EF Code First 上下文的?BlogContext?類組成。
using?System.Data.Entity;?
using?System.Collections.Generic;?
using?System.ComponentModel.DataAnnotations;?
using?System.Data.Entity.Infrastructure;?
?
namespace?MigrationsDemo?
{?
????public?class?BlogContext?:?DbContext?
????{?
????????public?DbSet<Blog>?Blogs?{?get;?set;?}?
????}?
?
????public?class?Blog?
????{?
????????public?int?BlogId?{?get;?set;?}?
????????public?string?Name?{?get;?set;?}?
????}?
}
  • 現在我們已經有了一個模型,該使用它來執行數據訪問了。用下面所示代碼更新?Program.cs?文件。
using?System;?
using?System.Collections.Generic;?
using?System.Linq;?
using?System.Text;?
?
namespace?MigrationsDemo?
{?
????class?Program?
????{?
????????static?void?Main(string[]?args)?
????????{?
????????????using?(var?db?=?new?BlogContext())?
????????????{?
????????????????db.Blogs.Add(new?Blog?{?Name?=?"Another?Blog?"?});?
????????????????db.SaveChanges();?
?
????????????????foreach?(var?blog?in?db.Blogs)?
????????????????{?
????????????????????Console.WriteLine(blog.Name);?
????????????????}?
????????????}?
?
????????????Console.WriteLine("Press?any?key?to?exit...");?
????????????Console.ReadKey();?
????????}?
????}?
}
  • 運行應用程序,您會看到已為您創建?MigrationsCodeDemo.BlogContext?數據庫。

    如果安裝了 SQL Express(包括在 Visual Studio 2010 中),則該數據庫將在本地 SQL Express 實例(.\SQLEXPRESS)中創建。如果未安裝 SQL Express,則 Code First 將嘗試使用 LocalDb ((localdb)\v11.0) - LocalDb 包括在 Visual Studio 2012 中。

    注意:如果安裝有 SQL Express,則始終優先使用它,即使您在使用 Visual Studio 2012 也是如此


    (LocaDb 數據庫)


    (SQL Express 數據庫)

?

啟用遷移

現在要對我們的模型進行一些更改。

  • 讓我們向 Blog 類引入一個 Url 屬性。
public?string?Url?{?get;?set;?}

如果您打算再次運行該應用程序,則將顯示 InvalidOperationException,表明支持“BlogContext”上下文的模型已在數據庫創建后發生更改。請考慮使用 Code First 遷移更新數據庫 (?http://go.microsoft.com/fwlink/?LinkId=238269)。

按異常消息指示,現在應該開始使用 Code First 遷移。第一步是為上下文啟用遷移。

  • 在程序包管理器控制臺中運行?Enable-Migrations?命令

此命令已為項目添加了?Migrations?文件夾,此新文件夾包含兩個文件:

  • Configuration 類。此類允許您針對上下文配置遷移的行為。對于此演練,我們將使用默認配置。
    因為在您的項目中只有一個 Code First 上下文,所以 Enable-Migrations 已自動填入要應用此配置的上下文類型中。
  • InitialCreate 遷移。此遷移已在啟用遷移之前生成,因為我們事先讓 Code First 自動創建了一個數據庫。此基架遷移中的代碼表示數據庫中已創建的對象。在本例中,此類對象為?Blog?表,其中包含?BlogId?和?Name?列。文件名包含時間戳,這對于排序十分有幫助。
    如果尚未創建數據庫,則不會將此 InitialCreate 遷移添加到項目中。而是,首次調用 Add-Migration 時,用于創建這些表的代碼將為新遷移搭建基架。

?

生成并運行遷移

Code First 遷移有兩個主命令,下面您將會熟悉它們。

  • Add-Migration?將根據自創建上次遷移以來您對模型所做的更改,為下一次遷移搭建基架。
  • Update-Database?將所有掛起的遷移應用于數據庫。

我們需要為遷移搭建基架以處理先前添加的新 Url 屬性。使用?Add-Migration?命令可以為這些遷移指定名稱,我們將其稱為?AddBlogUrl。

  • 在程序包管理器控制臺中運行?Add-Migration AddBlogUrl?命令。
  • 在?Migrations?文件夾中,現在有了新的?AddBlogUrl?遷移。該遷移文件名以時間戳作為前綴,這對于排序十分有幫助。
namespace?MigrationsDemo.Migrations?
{?
????using?System;?
????using?System.Data.Entity.Migrations;?
?????
????public?partial?class?AddBlogUrl?:?DbMigration?
????{?
????????public?override?void?Up()?
????????{?
????????????AddColumn("Blogs",?"Url",?c?=>?c.String());?
????????}?
?????????
????????public?override?void?Down()?
????????{?
????????????DropColumn("Blogs",?"Url");?
????????}?
????}?
}

現在,我們可以編輯此遷移或向其添加內容,一切都很不錯。讓我們使用?Update-Database?將此遷移應用于數據庫。

  • 在程序包管理器控制臺中運行?Update-Database?命令。
  • Code First 遷移將對?Migrations?文件夾中的遷移與已應用于數據庫的遷移進行比較。它將了解到需要應用?AddBlogUrl?遷移,于是便運行該遷移。

此時,MigrationsDemo.BlogContext?數據庫已進行了更新,其?Blogs?表中包含了?Url?列。

?

自定義遷移

到目前為止,我們生成并運行了遷移,而未進行任何更改?,F在,讓我們看一下如何編輯默認情況下生成的代碼。

  • 我們需要對模型再進行一些更改,讓我們向?Blog?類添加一個新的?Rating?屬性。
public?int?Rating?{?get;?set;?}
  • 再添加一個新的?Post?類
public?class?Post?
{?
????public?int?PostId?{?get;?set;?}?
????[MaxLength(200)]?
????public?string?Title?{?get;?set;?}?
????public?string?Content?{?get;?set;?}?
?
????public?int?BlogId?{?get;?set;?}?
????public?Blog?Blog?{?get;?set;?}?
}
  • 我們還要向?Blog?類添加一個?Posts?集合,以在?Blog?與?Post?之間形成另一層關系。
public?virtual?List<Post>?Posts?{?get;?set;?}

我們將使用?Add-Migration?命令讓 Code First 遷移自動在遷移時為其最佳猜測搭建基架。我們將此遷移稱為?AddPostClass

  • 在程序包管理器控制臺中運行?Add-Migration AddPostClass?命令。

Code First 遷移為這些更改搭建基架的工作做得很好,但有些內容可能需要我們更改:

  • 首先,我們向?Posts.Title?列添加一個唯一索引
    (添加到以下代碼的第 22 和 29 行)。
  • 還添加一個不可為 Null 的?Blogs.Rating?列。如果表中有任何現有數據,則這些數據將被分配采用新列數據類型的 CLR 默認值(Rating 為整數,因此默認值將為?0)。但我們想指定默認值?3,為?Blogs?表中的現有行設置一個還不錯的起始等級。
    (您可以在以下代碼的第 24 行看到指定的默認值)
  • namespace?MigrationsCodeDemo.Migrations?
    {?
    ????using?System;?
    ????using?System.Data.Entity.Migrations;?
    ?
    ????public?partial?class?AddPostClass?:?DbMigration?
    ????{?
    ????????public?override?void?Up()?
    ????????{?
    ????????????CreateTable(?
    ????????????????"Posts",?
    ????????????????c?=>?new?
    ????????????????????{?
    ????????????????????????PostId?=?c.Int(nullable:?false,?identity:?true),?
    ????????????????????????Title?=?c.String(maxLength:?200),?
    ????????????????????????Content?=?c.String(),?
    ????????????????????????BlogId?=?c.Int(nullable:?false),?
    ????????????????????})?
    ????????????????.PrimaryKey(t?=>?t.PostId)?
    ????????????????.ForeignKey("Blogs",?t?=>?t.BlogId,?cascadeDelete:?true)?
    ????????????????.Index(t?=>?t.BlogId)?
    ????????????????.Index(p?=>?p.Title,?unique:?true);?
    ?
    ????????????AddColumn("Blogs",?"Rating",?c?=>?c.Int(nullable:?false,?defaultValue:?3));?
    ????????}?
    ?
    ????????public?override?void?Down()?
    ????????{?
    ????????????DropIndex("Posts",?new[]?{?"Title"?});?
    ????????????DropIndex("Posts",?new[]?{?"BlogId"?});?
    ????????????DropForeignKey("Posts",?"BlogId",?"Blogs");?
    ????????????DropColumn("Blogs",?"Rating");?
    ????????????DropTable("Posts");?
    ????????}?
    ????}?
    }

    我們編輯好的遷移已準備就緒,讓我們使用?Update-Database?更新數據庫。這次指定?–Verbose?標記,以便您能夠看見 Code First 遷移所運行的 SQL。

    • 在程序包管理器控制臺中運行?Update-Database –Verbose?命令。

    ?

    數據移動/自定義 SQL

    到目前為止,我們了解了不更改或遷移任何數據的遷移操作,現在看一下需要來回移動一些數據的遷移操作。目前還沒有為數據移動提供本機支持,但我們可以在腳本中的任何位置運行一些任意 SQL 命令。

    • 現在向模型中添加一個?Post.Abstract?屬性。隨后,我們將使用?Content?列開頭的一些文本為現有文章預填充?Abstract。
    public?string?Abstract?{?get;?set;?}

    我們將使用?Add-Migration?命令讓 Code First 遷移自動在遷移時為其最佳猜測搭建基架。

    • 在程序包管理器控制臺中運行?Add-Migration AddPostAbstract?命令。
    • 生成的遷移負責處理架構更改,但我們還希望使用每篇文章內容的前 100 個字符預填充?Abstract?列。為此,可以向下拖到 SQL 并在添加該列后運行UPDATE?語句。
      (添加到以下代碼的第 12 行)。
    namespace?MigrationsCodeDemo.Migrations?
    {?
    ????using?System;?
    ????using?System.Data.Entity.Migrations;?
    ?????
    ????public?partial?class?AddPostAbstract?:?DbMigration?
    ????{?
    ????????public?override?void?Up()?
    ????????{?
    ????????????AddColumn("Posts",?"Abstract",?c?=>?c.String());?
    ?
    ????????????Sql("UPDATE?Posts?SET?Abstract?=?LEFT(Content,?100)?WHERE?Abstract?IS?NULL");?
    ????????}?
    ?????????
    ????????public?override?void?Down()?
    ????????{?
    ????????????DropColumn("Posts",?"Abstract");?
    ????????}?
    ????}?
    }

    我們編輯好的遷移很不錯,讓我們使用?Update-Database?更新數據庫。我們將指定?–Verbose?標記,以便可以查看正在對數據庫運行的 SQL。

    • 在程序包管理器控制臺中運行?Update-Database –Verbose?命令。

    ?

    遷移到特定版本(包括降級)

    到目前為止,我們一直是升級到最新遷移,但有時您可能需要升級/降級到特定遷移。

    假如我們希望將數據庫遷移到當時運行?AddBlogUrl?遷移后所處的狀態??梢允褂?–TargetMigration?開關降級到此遷移。

    • 在程序包管理器控制臺中運行?Update-Database –TargetMigration: AddBlogUrl?命令。

    此命令將為?AddBlogAbstract?和?AddPostClass?遷移運行 Down 腳本。

    如果要一直回滾到空數據庫,可以使用?Update-Database –TargetMigration: $InitialDatabase?命令。

    ?

    獲取 SQL 腳本

    假如其他開發人員的計算機上也需要這些更改,則在我們將所做的更改簽入源代碼管理后,他們只需執行同步操作即可。在他們得到我們的新遷移后,即可運行 Update-Database 命令在本地應用這些更改。不過,如果希望將這些更改推送到測試服務器并最終應用于生產,我們可能希望向 DBA 提交一個 SQL 腳本。

    • 運行?Update-Database?命令,但此時指定?–Script?標記,使更改寫入腳本而不應用。我們還將指定為其生成腳本的源和目標遷移。我們希望腳本用于從空數據庫 ($InitialDatabase) 最新版本(遷移?AddPostAbstract)的遷移。
      如果不希望指定目標遷移,遷移將使用最新遷移作為目標。如果未指定源遷移,遷移將使用數據庫的當前狀態。
    • 在程序包管理器控制臺中運行?Update-Database -Script -SourceMigration: $InitialDatabase -TargetMigration: AddPostAbstract?命令。

    Code First 遷移將運行遷移管道,而不是實際應用更改,它會自動將更改寫出到一個 .sql 文件。生成腳本后,將會自動在 Visual Studio 中打開它,以供您查看或保存。

    ?

    在應用程序啟動時自動升級(MigrateDatabaseToLatestVersion 初始值設定項)

    如果您要部署應用程序,可能希望在應用程序啟動時自動升級數據庫(通過應用所有掛起的遷移)??赏ㄟ^注冊?MigrateDatabaseToLatestVersion?數據庫初始值設定項來實現這一點。數據庫初始值設定項只是包含用于確保數據庫安裝正確的某種邏輯。首次在應用程序進程 (AppDomain) 中使用上下文時,將運行此邏輯。

    我們可以更新?Program.cs?文件(如下所示),先設置 BlogContext 的?MigrateDatabaseToLatestVersion?初始值設定項,然后再使用上下文(第 14 行)。請注意,您還需要為?System.Data.Entity?命名空間添加一個 using 語句(第 5 行)。

    創建此初始值設定項的實例時,需要指定上下文類型 (BlogContext) 和遷移配置 (Configuration) - 遷移配置是啟用遷移時添加到?Migrations?文件夾的類。

    using?System;?
    using?System.Collections.Generic;?
    using?System.Linq;?
    using?System.Text;?
    using?System.Data.Entity;?
    using?MigrationsDemo.Migrations;?
    ?
    namespace?MigrationsDemo?
    {?
    ????class?Program?
    ????{?
    ????????static?void?Main(string[]?args)?
    ????????{?
    ????????????Database.SetInitializer(new?MigrateDatabaseToLatestVersion<BlogContext,?Configuration>());?
    ?
    ????????????using?(var?db?=?new?BlogContext())?
    ????????????{?
    ????????????????db.Blogs.Add(new?Blog?{?Name?=?"Another?Blog?"?});?
    ????????????????db.SaveChanges();?
    ?
    ????????????????foreach?(var?blog?in?db.Blogs)?
    ????????????????{?
    ????????????????????Console.WriteLine(blog.Name);?
    ????????????????}?
    ????????????}?
    ?
    ????????????Console.WriteLine("Press?any?key?to?exit...");?
    ????????????Console.ReadKey();?
    ????????}?
    ????}?
    }

    現在,每次應用程序運行時,它都會先檢查所面向的數據庫是否是最新的;如果不是,便會應用所有掛起的遷移。

    轉載于:https://www.cnblogs.com/sjqq/p/7749816.html

    總結

    以上是生活随笔為你收集整理的Code First 迁移的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。