EntityFramework Code First便捷工具——數據遷移

来源:http://www.cnblogs.com/NikoRanger/archive/2017/09/28/7605237.html
-Advertisement-
Play Games

使用EntityFramework Code First開發,數據遷移是一個不得不提的技術。 在我們的開發過程中,難免需要對模型進行改進,模型改進後,會導致實體集與資料庫不一致,當然我們可以通過刪除資料庫然後再重構資料庫,但是在生產環境中這樣做,這樣或多或少會出現一些問題。使用“數據遷移”,可以幫助 ...


使用EntityFramework Code First開發,數據遷移是一個不得不提的技術。

在我們的開發過程中,難免需要對模型進行改進,模型改進後,會導致實體集與資料庫不一致,當然我們可以通過刪除資料庫然後再重構資料庫,但是在生產環境中這樣做,這樣或多或少會出現一些問題。使用“數據遷移”,可以幫助我們解決這個問題。

數據遷移,添加的是我們對資料庫的改動,這一點可以從下麵Demo中可以看出來。每對資料庫進行一次改動(如刪除了某個表,更改了某一列),添加一次數據遷移,然後更新資料庫,這樣就能夠達到我們的目的。

先說一下我用的工具:

Vs2015 pro

Sql Serer 2014 developer

現在微軟的開發工具開發者版都免費了,個人用戶的話用起來還是會比較舒服的。

接下來放上一個小的Demo

新建一個空白解決方案(文件-新建-項目-其他項目類型-空白解決方案)Demo

然後添加兩個類庫,分別命名為Demo.Model和Demo.DAL。

添加一個Web應用程式(MVC),命名為Demo.UI

分別為Demo.Model、Demo.UI、Demo.DAL安裝EntitFramework。

程式包管理控制台輸入

Install-Package EntityFramwork

在Demo.Model中添加一個User類

namespace Demo.Model
{
    public class User
    {
        public int UserId { get; set; }

        public string UseraName { get; set; }

        public string Password{ get; set; }
    }
}

在Demo.DAL中添加一個DemoDbContext類,該類繼承自DbContext類,作用主要是對資料庫結構的映射(個人理解)。

using Demo.Model;
using System.Data.Entity;

namespace Demo.DAL
{
    public class DemoDbContext:DbContext
    {
        public DemoDbContext() : base("Name=DefaultConnection")
        {

        }
        //添加User表
        public IDbSet<User> Users { get; set; }
    }
}

開啟數據遷移

在程式包管理控制台輸入(不區分大小寫):

Enable-Migrations

執行完可以發現,這裡新建了一個名為 Migration 的文件夾和一個配置文件

然後進行下一步操作,設置 Demo.UI 為啟動項目

然後修改Web.config中的ConnectionString屬性

<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=.;User Id=sa;Password=123; Database=DemoDbContext" providerName="System.Data.SqlClient" />
</connectionStrings>

這裡定義的是連接字元串,不同的 Sql 版本對應的連接字元串可能會不一致,Sql Server Express 版本預設的實例名為 SQLEXPRESS 所以連接字元串應為

<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=./sqlexpress;User Id=sa;Password=123; Database=DemoDbContext" providerName="System.Data.SqlClient" />
</connectionStrings>

這裡註意一下 Database 屬性,這裡定義的為資料庫的名稱,這裡要與前面定義的 DemoDbContext 保持一致。

配置好以後,在程式包管理控制台視窗輸入

Add-Migration Add_User_Entity

這樣我們就添加了一次數據遷移,數據遷移的名稱為 Add_User_Entity

執行完之後會發現,Migration 文件夾添加了一個配置文件 201709250342176_Add_User_Entity.cs 前面是時間,後面是我們數據遷移的名字。

添加測試數據

Demo.DALMigration 文件夾中添加一個名為 Seed 的文件夾

添加一個 UserSeed

using Demo.Model;

namespace Demo.DAL.Migrations.Seed
{
    public class UserSeed
    {
        public readonly DemoDbContext _dbcontext;

        public UserSeed(DemoDbContext context)
        {
            _dbcontext = context;
        }

        public void Create()
        {
            AddSeed();
        }

        public void AddSeed()
        {
            User User = new User
            {
                Password = "123",
                UseraName = "Niko"
            };
            _dbcontext.Users.Add(User);
            _dbcontext.SaveChanges();
        }

     }
}

Migration 文件夾 Configuration.cs 中添加

    protected override void Seed(Demo.DAL.DemoDbContext context)
    {
        //添加種子數據
        new UserSeed(context).Create();

    }

添加完以後,執行最後一步 —— 更新資料庫

在程式包管理控制台輸入

Update-Database

或者

Update-Database -Verbose

後者會在控制台輸出對資料庫的操作過程,這樣我們在資料庫中就建立了一個名為 DemoDbContext 的資料庫,併在裡面添加了一個 Users 表,並添加了我們想要的測試數據:

以後每對資料庫進行一次改動,就添加一次數據遷移,然後更新資料庫,即可實現我們的目的。


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

-Advertisement-
Play Games
更多相關文章
  • 轉載需註明來源:http://www.cnblogs.com/yczcc/p/7594322.html openssl官網:https://www.openssl.org 下載源碼 源碼地址為:https://www.openssl.org/source/old/;當前最新版本為 1.1.0f,ht ...
  • 創建LVM分區: 相關命令: pvcreat /dev/sdb{1,2,3} 創建物理捲 vgcreat test_vg1 /dev/sdb1 創建捲組 vgcreat test_vg2 -s 16M /dev/sdb2 /dev/sdb3 指定PE大小為16M lvcreat 在已存在的捲組中創建 ...
  • 自己挖了一個大坑,,,然後苦逼的在碼代碼重寫樣式! 廢物不多少 直接上代碼 先在前臺創建一個TextBox,然後各種附加的屬性加上去:如圖所示 效果圖: 樣式代碼: 本文原創出處:http://www.cnblogs.com/PettyHandSome/ 歡迎各位轉載,但是未經作者本人同意,轉載文章 ...
  • 1. foreach C#編譯器會把foreach語句轉換為IEnumerable介面的方法和屬性。 foreach語句會解析為下麵的代碼段。 調用GetEnumerator()方法,獲得數組的一個枚舉 在while迴圈中,只要MoveNext()返回true,就一直迴圈下去 用Current屬性訪 ...
  • 用socket做了個程式,本地測試沒有問題,發佈到伺服器上時連接不上,用telnet測試連接失敗 伺服器上netstat -a 查看埠情況,127.0.0.1綁定埠9300處於監聽狀態,如下圖: 修改socket綁定IP為伺服器IP,埠狀態變為下圖: telnet連接測試成功! 很納悶,查了下 ...
  • 問題的產生的背景 由於我們使用了jenkins進行部署(jenkins~集群分發功能和職責處理),而對於.net core項目來說又是跨平臺的,所以對它的項目拉取,包的還原,項目的編譯和項目的發佈都是在一臺linux的jenkins節點上進行的,而我們開發時是在windows系統,所以在進行還原和編 ...
  • Tips 原文作者:Thomas Anderson, Blinkist 原文地址:Steve Jobs was successful because he mastered 'deep work' — here's how you can, too 你喝過麥卡倫姆威士忌嗎?如果你有這樣的經歷,你一定 ...
  • 出於安全考慮,在後臺與前臺進行數據傳輸時,往往不會直接傳輸實體模型,而是使用Dto(Data transfer object 數據傳輸對象),這樣在後臺往前臺傳遞數據時可以省略不必要的信息,只保留必要的信息,大大增強數據安全性。 下麵給出兩個相互對應的關係模型User、UserDto public ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...