使用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.DAL
中 Migration
文件夾中添加一個名為 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
表,並添加了我們想要的測試數據:
以後每對資料庫進行一次改動,就添加一次數據遷移,然後更新資料庫,即可實現我們的目的。