Entity Framework Code First遷移基本面拾遺

来源:http://www.cnblogs.com/darrenji/archive/2016/03/17/5285855.html
-Advertisement-
Play Games

項目中用到了EF Code First和遷移,但發現有些方面似懂非懂。比如:如何在遷移文件中控制遷移過程?如果在遷移文件中執行SQL語句?如何使用Update-Database的其它參數?資料庫在生產環境的時候如何遷移?於是就有了下麵的這些體驗:enable-migration第一次生成資料庫時使用


 

項目中用到了EF Code First和遷移,但發現有些方面似懂非懂。比如:如何在遷移文件中控制遷移過程?如果在遷移文件中執行SQL語句?如何使用Update-Database的其它參數?資料庫在生產環境的時候如何遷移?於是就有了下麵的這些體驗:


enable-migration

第一次生成資料庫時使用。

→ enable-migration
→ 在類庫下多了Migrations文件夾,包含Configuration.cs和每次的遷移記錄文件

每次的遷移文件大致是:

public partial class InitialCreae : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "Aliases",
            c => new 
                {
                    Id = c.Int(nullable: false, identity: true),
                    Name = c.String(nullable: false),
                    UserName = c.String(maxLength:30),
                    Email = c.String(),
                    Bio = c.String(),
                    CreateDate = c.DateTime(nullable: false)
                }
        )
        .PrimaryKey(t => t.Id);
        
        CreateTable(
            "Tweets",
            c => new 
                {
                    Id = c.Int(nullable: false, identity:true),
                    CreateDate = c.DateTime(nullable: false),
                    AliasId = c.Int(nullable:false)
                }
        )
        .PrimaryKey(t => t.Id)
        .ForeignKey("Aliases", t => t.AliasId, cascadeDelete: true)
        .Index(t => t.AliasId);
    }
    
    public override Down()
    {
        DropIndex("Tweets", new[]{"AliasId"});
        DropForeignKey("Tweets", "AliasId", "Aliases");
        DropTable("Tweets");
        DropTable("Aliases");
    }
}

 

遷移的配置文件大致是:

internal sealed class Configuration : DbMigrationsConfiguration<TweeterContext>
{
    public Configuration()
    {
        AutomatecMigrationsEnabled = false;
    }
    
    protected override void Seed(TwitterContext context)
    {
    
    }
}

 

資料庫初始化

Database.SetInitializer(new MigrateDatabaseToLastesVerstion<TwitterContext, Configuration>());

自動或手動遷移設置

 

public class Configuration : : DbMigrationsConfiguration<TweeterContext>
{
    public Configuration()
    {
        //如果手動遷移,設置成false
        AutomaticMigrationsEnabled = true;
        
        //即使列中有數據,這個列也可以被刪除,刪除的時候只是少了該列的數據
        AutomaticMigrationDataLossAllowd = true;
    }
}

 

Add-Migration

每次遷移保存在本地。

配置文件大致如下:

public class Configuration : DbMigrationsConfiguration<TwitterContext>
{
    public Configuraiton()
    {
        AutomatcMigrationsEnabled = false;
        AutomaticMigrationDataLossAllowed = true;
    }
    
    protected override void Seed(TwitterContext context)
    {
    
    }
}

 

→ 比如增加一個列

→ 運行: Add-Migration somename

→ 遷移文件大致是

public partial class AddSomeColumnToSomeTable : DbMigration
{
    public override void up()
    {
        AddColumn("sometable", "somecolumn", c => c.String());
    }
    
    public override void Down()
    {
        DropColumn("sometable", "somecolumn");
    }
}

 

Update-Database

更新資料庫,執行沒有被執行的遷移文件。

→ 執行:update-database -verbose

verbose表示顯示更新明細,會顯示執行了哪些遷移,執行了哪些SQL語句。

→ 其它參數

TargetMigration
Script & SourceMigration:創建SQL語句
Force:允許數據丟失
ProjectName:DbMigrationsConfiguraiton所在的類庫
ConfigurationTypeName:DbMigrationsConfiguration的繼承類
SartUpProjectName:連接字元串所在的類庫
ConnectionString & ConnectionProviderName:明確連接字元串或provider

或者通過:get-help update-database -detailed, 瞭解更多。

回滾

Update-Database -TargetMigration:"SomeMigrationName" -verbose

在遷移文件中自定義一些遷移動作,控制遷移過程

所有的遷移文件繼承自DbMigration這個類,該類提供了很多方法供我們控制遷移過程。

→ 比如讓增加的類有一個預設值

public partial class AddSomeColumn : DbMigration
{
    public override void Up()
    {
        AddColumn("sometable", "somecolumn", c => c.String(defaultValue: "sth"));
    }
    
    public override void Down()
    {
        DropColumn("sometable", "somecolumn");
    }
}

 

執行SQL語句

比如,現有數據的某些列為NULL,如果想給這些行的該列附上值,該如何做呢?

→ 改變領域模型
→ 執行:Add-Migration somename
→ 在遷移文件中執行SQL語句

 

public partial class AddSome : DbMigration
{
    public override void Up()
    {
        AddColumn("table", "column", c => c.String(maxLength:10));
        Sql("Update table set column='sth'");
    }
    
    public override void Down()
    {
        DropColumn("table", "column");
    }
}

 

→ Update-Database -verbose

資料庫的種子數據

 

public class Configuration : DbMigrationsConfiguraiton<TwitterCotext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        AutomaticMigraitoinDataLossAllowed = true;
    }
    
    protected override void Seed(TwitterContext context)
    {
        context.Aliases.AddOrUpdate(a => a.Name, new Alias{}, new ALias())
    }
}

 

對生產環境下的資料庫作遷移

→ 執行:udb -script -verbose
→ 彈出一個可以編寫sql語句的視窗,此時沒有與資料庫連接

alter table sometable add column nvarchar(max)

insert into _MigrationHistory(MigrationId,CreatedOn, Model, ProductVersion) values(...)

→ 執行:udb -verbose

此時與資料庫連接,執行語句

→ 如果想從某個一個遷移開始

udb -sourcemigration:"somename" -script

→ 執行: udb -verbose

關閉種子數據

Database.SetIntializer<SomeContext>(null);

 


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

-Advertisement-
Play Games
更多相關文章
  • 轉自:http://engrmosaic.uncc.edu/mosaic-anywhere/remote-desktop-file-format The new Terminal Services client (version 2600 and newer, 5.1.2600.x) introdu
  • Nginx 訪問日誌輪詢切割腳本         配置www.conf     配置bbs.conf     配置blog.conf 測試     配置定時任務使得每天0點整執行腳本    
  • 初學者對 : Controller where T : class,new() 不理解 ,我是初學者的時候也一樣不理解,在此做個簡單的解釋:這是類型參數約束,.NET支持的類型參數約束有以下五種: where T : struct | T必須是一個結構類型 where T : class | T必須
  • 異常處理彙總-前端系列 http://www.cnblogs.com/dunitian/p/4523015.html 舉個例子 重點:display:flex (參考:http://www.360doc.com/content/14/0811/01/2633_400926000.shtml) 效果
  • 一、前言 異常處理是每個系統必不可少的一個重要部分,它可以讓我們的程式在發生錯誤時友好地提示、記錄錯誤信息,更重要的是不破壞正常的數據和影響系統運行。異常處理應該是一個橫切點,所謂橫切點就是各個部分都會使用到它,無論是分層中的哪一個層,還是具體的哪個業務邏輯模塊,所關註的都是一樣的。所以,橫切關註點
  • 本文闡述C#中相等性比較,其中主要集中在下麵兩個方面 ==和!=運算符,什麼時候它們可以用於相等性比較,什麼時候它們不適用,如果不使用,那麼它們的替代方式是什麼? 什麼時候,需要自定一個類型的相等性比較邏輯 在闡述相等性比較,以及如何自定義相等性比較邏輯之前,我們首先瞭解一下值類型比較和引用類型比較
  • CheckBox控制項,由於它的值是選擇與非選擇。因此在提交數據時,想讓用戶必須選擇CheckBox,普通情況之下,不好做驗證。 但我們可以使用asp:CustomValidator來驗證,不過還得寫自定義驗證Javascript代碼,可參考如下:
  • Mysql操作 調用
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...