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);
    }
}

第二步.將自定義的資料庫初始化器添加到context中

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
更多相關文章
  • 摘要:IIS配置成功後,系統一直提示無法載入應用程式集,iis已經進行過net frame重新註冊,bin文件夾也設置了everyone許可權,無論怎麼搗騰,都提示無法載入相應的程式,通過查閱網上N多資料,終於找到了相關設置方法,先記錄如下:錯誤信息: c_sharp_無法載入應用程式表現形式 處理方 ...
  • 1、右擊安裝編輯程式,在“視圖”菜單中,選擇“註冊表”。 2、創建“鍵”:HKCU\Software\Microsoft\Windows\CurrentVersion\Run 3、右鍵Run,新建“字元串值”。在屬性頁面設置name和value值([TARGETDIR]Form1.exe)。 ...
  • 一、添加引用 System.DirectoryServices System.DirectoryServices.AccountManagement 二、驗證代碼 聲明域 驗證代碼 三、開放埠 如果調用不通,需要防火牆開放389埠 ...
  • 一、基本介紹 回憶:最早接觸Expression是在學校接觸到EF的時候,發現where方法里的參數是Expression<Func<T,bool>>這麼一個類型,當初也只是看到了,也沒有過多的去探究,只是知道傳入lambda表達式使用即可,對於Expression和裡面的Func<T,bool>到 ...
  • 客戶端對文件的分割: ind.IsBusy = true; ind.Text = "上傳中...."; string cs_str = "server=" + GlobalVars.g_ServerID + "&userid="+GlobalVars.g_userID; string url = G ...
  • 預處理器指令指導編譯器在實際編譯開始之前對信息進行預處理。所有的預處理器指令都是以 # 開始。 #define 預處理器指令創建符號常量。#define 允許您定義一個符號,這樣,通過使用符號作為傳遞給 #if 指令的表達式,表達式將返回 true。在程式調試和運行上有重要的作用。比如預處理器指令可 ...
  • 由於項目需要,所以寫了下麵一段添加水印的代碼,如下: 後臺代碼: /// /// 上傳圖片 /// ///文件 ///保存的文件夾名稱 [HttpPost] public ActionResult UpLoadingImg(HttpPostedFileBase upfile, string file ...
  • 一、前言 1、本文主要內容 ASP.NET Core MVC路由工作原理概述 ASP.NET Core MVC帶路徑參數的路由示例 ASP.NET Core MVC固定前/尾碼的路由示例 ASP.NET Core MVC正則表達式匹配路由示例 ASP.NET Core MVC路由約束與自定義路由約束 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...