EF CodeFirst系列(9)---添加初始化數據和資料庫遷移策略

来源:https://www.cnblogs.com/wyy1234/archive/2018/09/25/9700446.html
-Advertisement-
Play Games

1.添加初始化數據(Seed) 我們可以在初始化資料庫的過程中給資料庫添加一些數據。為了實現初始化數據(seed data)我們必須創建一個自定義的資料庫初始化器(DB initializer),並重寫其中的Seed方法。 下邊的慄子展示在School資料庫中給Standard表添加預設的數據: 第 ...


1.添加初始化數據(Seed)

  我們可以在初始化資料庫的過程中給資料庫添加一些數據。為了實現初始化數據(seed data)我們必須創建一個自定義的資料庫初始化器(DB initializer),並重寫其中的Seed方法。

  下邊的慄子展示在School資料庫中給Standard表添加預設的數據:

第一步:創建自定義初始化器

//繼承三種內置的初始化器中的DropCreateDatabaseAlways
public class SchoolDBInitializer : DropCreateDatabaseAlways<SchoolDBContext>
{
    protected override void Seed(SchoolDBContext context)
    {
        IList<Standard> defaultStandards = new List<Standard>();

        defaultStandards.Add(new Standard() { StandardName = "Standard 1", Description = "First Standard" });
        defaultStandards.Add(new Standard() { StandardName = "Standard 2", Description = "Second Standard" });
        defaultStandards.Add(new Standard() { StandardName = "Standard 3", Description = "Third Standard" });

        context.Standards.AddRange(defaultStandards);
     //初始化數據
        base.Seed(context);
    }
}

2.使用Seed方法添加初始化數據

public class SchoolContext: DbContext 
{
    public SchoolContext(): base("SchoolDB") 
    {
        Database.SetInitializer(new SchoolDBInitializer());
    }
    
    public DbSet<Student> Students { get; set; }
    public DbSet<Standard> Standards { get; set; }
}

2.資料庫遷移策略

  前邊我們已經知道了EF中的資料庫遷移策略(CreateDatabaseIfNotExists,DropCreateDatabaseIfModelChanges, and DropCreateDatabaseAlways.),但是因為這些策略都是刪除舊的資料庫然後創建一個新的資料庫,所以使用這些策略會造成資料庫中的數據(不是seed data的數據)、存儲過程、觸發器等內容丟失

  針對上邊的問題,EF提供了一個新的資料庫初始化器 MigrateDatabaseToLastestVersion,這個工具在實體模型改變時自動幫我們更新資料庫,且不會造成數據丟失。

下邊介紹兩種更新資料庫的方法:

1.自動遷移

第一步:

在程式包管理器控制台輸入

enable-migrations –EnableAutomaticMigration:$true

執行成功後,EFAp創建了一個繼承自DbMigrationConfiguration類的Configuration類,如下

    internal sealed class Configuration : DbMigrationsConfiguration<EF6Demo.SchoolContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;//自動遷移為true
            AutomaticMigrationDataLossAllowed = true;//允許數據丟失,預設生成時沒有這一項(不添加這一項時,只在添加/刪除實體類時自動生成,如果我們刪除了實體類的一個屬性就會拋出異常)
            ContextKey = "EF6Demo.SchoolContext";
        }

        protected override void Seed(EF6Demo.SchoolContext context)
        {
            //  This method will be called after migrating to the latest version.

            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data.
        }
    }

 

第二步:

把資料庫初始化器添加到配置中,context代碼如下:

    public class SchoolContext : DbContext
    {
        public SchoolContext() {
            //添加MigrateDatabaseToLatestVersion資料庫初始化器
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<SchoolContext, Configuration>());
        }
        public virtual DbSet<Student> Students { get; set; }
        public virtual DbSet<Standard> Standards { get; set; }
        
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }
    }

完成上邊兩步,當我們修改實體類時運行程式就會自動更新資料庫。

2.使用代碼遷移

   上邊我們瞭解了通過自動遷移來更新資料庫,這裡介紹通過代碼更新資料庫的方法。通過代碼更新資料庫的功能更強大,如我們可以給資料庫的列添加預設值,添加計算列等。

  使用代碼遷移,我們在程式包控制台執行以下過程:

1.Enable-Migrations [-f]

  這條命令會生成一個Configuration文件,當配置文件存在時可通過-f尾碼強制覆蓋舊文件。執行成功後添加了Migrations文件夾,文件夾中包含一個Configuration配置類,如下:

Configuration配置類代碼如下:

    internal sealed class Configuration : DbMigrationsConfiguration<EF6Demo.SchoolContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
            ContextKey = "EF6Demo.SchoolContext";
        }

        protected override void Seed(EF6Demo.SchoolContext context)
        {
            //  This method will be called after migrating to the latest version.

            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data.
        }
    }

2.Add-Migration [MigName]

  首先在context類中指定初始化器是MigrateDatabaseToLatestVersion初始化器,如下:

   public class SchoolContext : DbContext
    {
        public SchoolContext() {
            //添加MigrateDatabaseToLatestVersion資料庫初始化器
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<SchoolContext, Configuration>());
  
        }
        public virtual DbSet<Student> Students { get; set; }
        public virtual DbSet<Standard> Standards { get; set; }
        
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }
    }

在包管理器控制台執行:

 Add-Migration FirstInit

這會在Migration文件夾中生成一個<stamp>_name的遷移類:

 遷移類的代碼如下:

    public partial class FirstInit : DbMigration
    {
        //升級
        public override void Up()
        {
            CreateTable(
                "dbo.Standards",
                c => new
                    {
                        StandardId = c.Int(nullable: false, identity: true),
                        StandardName = c.String(),
                    })
                .PrimaryKey(t => t.StandardId);
            
            CreateTable(
                "dbo.Students",
                c => new
                    {
                        StudentId = c.Int(nullable: false, identity: true),
                        StudentName = c.String(),
                        Standard_StandardId = c.Int(),
                    })
                .PrimaryKey(t => t.StudentId)
                .ForeignKey("dbo.Standards", t => t.Standard_StandardId)
                .Index(t => t.Standard_StandardId);
            
        }
        //降級
        public override void Down()
        {
            DropForeignKey("dbo.Students", "Standard_StandardId", "dbo.Standards");
            DropIndex("dbo.Students", new[] { "Standard_StandardId" });
            DropTable("dbo.Students");
            DropTable("dbo.Standards");
        }
    }

我們可以看到遷移類中包含Up()和Down()方法,分別用於資料庫的更新和回退。

3.Update-Database 

① updata-database [-verbose]

  在程式包控制臺中執行這條命令時,會執行Add-Migration命令創建的最新的遷移文件,並更新資料庫

執行完上邊三步資料庫就生成了,以後當我們修改實體類時,執行Add-Migration [MigName]後再執行Update-Database [-verbose],就可方便地根據模型的變化更新資料庫。

② update-database -TargetMigration:xxx

如果我們想回退到某一個版本時執行:

update-database -TargetMigration:FirstInit//資料庫回退到第一次的版本

 3.codeFirst中的設計器

  我們知道codeFirst模式中不支持設計器,設計器對我們理解實體間關係還是很有用的,怎麼在code-first中使用設計器呢?Visual Studio Marketplace.點擊鏈接下載工具,安裝即可,安裝完成重啟VS,在context上點擊右鍵,然後會有一個Entity Framework選項,如下圖:

點擊ViewEntity Data Model選項就可以自動生成設計器,如下:

這個工具十分好用,同時也支持生成Model XML和DDL SQL推薦使用。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 標準庫 map multimap元素訪問 一,map,unordered_map下標操作 | 下標操作種類 | 功能描述 | | | | | c[k] | 返回關鍵字為k的元素;如果k不在c中,添加一個關鍵字為k的元素,並對其初始化 | | c.at(k) | 訪問關鍵字為k的元素;若k不在c中,拋 ...
  • 兩個基本類型變數相比較,=是比較它們的值是否相等 兩個對象相比是比較他們的地址值是否相等 equals()是比較對象的屬性值是否相等,前提是這兩個對象必須重寫object對象的equals方法,object對象是所有對象的基類,也就是所有對象都繼承了object對象,如果不重寫equals方法,ob ...
  • python筆記網站:http://www.runoob.com/python/python-tutorial.html ...
  • 1.pyc文件 是python預編譯後的位元組碼文件,並不是機器碼。2.PyCodeObject 是Python編譯器真正編譯成的結果; 當python程式運行時,編譯的結果是保存在PyCodeObject中。 在Python程式運行結束時,Python解釋器則將PyCodeObject寫回到pyc文 ...
  • 感謝博主提供的思路https://blog.csdn.net/softimite_zifeng/article/details/54289012 ...
  • 一、數值運算 各進位的數值計算很簡單,把各進位數轉換成 十進位數進行計算,然後再轉換成原類型即可。 舉例 :二進位之間的加法 二、位運算 什麼是位運算?程式中的所有內容在電腦記憶體中都是以二進位的形式儲存的(即:0或1),位運算就是直接對在記憶體中的二進位數的每位進行運算操作 在C#中可以對整型運算對 ...
  • MVC裡面如果直接將數據返回到前端頁面,我們常用的方式就是用return view(); 那麼我不想直接用razor語法,畢竟razor這玩意兒實在是太難記了,還不如寫ajax對接來得舒服不是 那麼我們可以這麼做 1.定義ActionResult,返回json,標記屬性可以採用HttpPost,也可 ...
  • 作者:依樂祝 原文地址:https://www.cnblogs.com/yilezhu/p/9703460.html NET Core項目發佈的時候你有沒有註意到這兩個選項呢?有沒有糾結過框架依賴與獨立部署到底有什麼區別呢?如果有的話那麼這篇文章可以參考下! 為什麼要寫這篇文章呢?因為今天同事問我框 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...