MVC EF6教程四 不丟失資料進行資料庫結構公升級

2022-07-27 01:57:09 字數 3847 閱讀 5901

本篇文章我們會使用 code first migrations的方式。

這個功能可以使你改變data model,在不drop and re-create資料庫的情況下更新資料庫的結構,將這些改變部署到生產環境中。

下面就著重介紹如何使用此功能。

先回顧下之前ef修改模型的方式。

我們事先配置好ef,每次資料模型改變的時候都會drop and re-create資料庫。

例如你增加、刪除、改變實體類,或改變dbcontext類後,執行程式時將會自動刪除已有的資料庫,建立乙個新資料庫來匹配修改後的模型,同樣也會根據seed方法中內容新建test data.

這種保持database和data model同步的方法在開發階段很方便。

如果已經部署到生產環境中就不行了, 例如表中擴充一些欄位啥的, 原來的資料就不能丟失。

我們禁用原來更新資料庫的方式,將web.config中contexts配置節注釋掉。

另外我們不用原來資料,改下資料庫名(mvcdemo改為mvcdemo2),這樣可以生成乙個新的資料庫,方便做實驗。

"

accountcontext

" connectionstring="

data source=.;database=mvcdemo2;uid=sa;pwd=123456;attachdbfilename=|datadirectory|\mvcdemo2.mdf;

" providername="

system.data.sqlclient

" />

下面就啟用code first migrations來解決資料庫更新的問題。

開啟package manager console,連續輸入enable-migrations 和 add-migration initialcreate命令

enable-migrations指令:

a.在專案根目錄下自動建立了乙個migrations資料夾

b.在migrations資料夾下自動新建乙個configuration.cs檔案。

如果前面沒修改web.config的資料庫名, 執行enable-migrations指令後,migrations將會找到已有的資料庫mvcdemo然後自動執行add-migration指令

前面執行 add-migration時,同樣在migrations資料夾裡面,產生乙個_initialcreate.cs的檔案。

裡面兩個方法,up和down:

up方法建立資料庫表,down方法刪除表。

public

partial

class

initialcreate : dbmigration

).primarykey(t =>t.id);

createtable(

"dbo.sysuserrole",

c => new

) .primarykey(t =>t.id)

.foreignkey(

"dbo.sysrole

", t => t.sysroleid, cascadedelete: true

) .foreignkey(

"dbo.sysuser

", t => t.sysuserid, cascadedelete: true

) .index(t =>t.sysuserid)

.index(t =>t.sysroleid);

createtable(

"dbo.sysuser",

c => new

) .primarykey(t =>t.id);

}public

override

void

down()

);dropindex(

"dbo.sysuserrole

", new );

droptable(

"dbo.sysuser");

droptable(

"dbo.sysuserrole");

droptable(

"dbo.sysrole");}}

下面我們就執行正式遷移。開啟package manager console,輸入 update-database

update-database指令呼叫了up方法來新建database的表(和data model entity set對應), 然後呼叫seed方法來填充測試資料。

這個時候開啟資料庫看下,完全符合我們的預期。

再進一步,我們新增乙個表organize,先新增乙個model

public

class

organize

//////

組織名稱

/// public

int organizename

}

修改accountcontext.cs, 增加乙個data model entity set

執行add-migration addtesttable和update-database, 完成資料庫表的新增。

去資料庫中檢查,發現已經多了organize這張表了

新增表之後,我發現表organize少加了乙個欄位parentid,欄位organizename的型別需要修改為字串型別,修改organize實體類

///

///組織名稱

/// public

string organizename

//////

上級組織id

/// public

int parentid

執行add-migration addtesttable和update-database, 完成資料庫表的修改。

最後再檢查下新產生的配置檔案

public

override

void

up()

public

override

void

down()

本次我們主要講解了資料庫遷移/公升級的問題。

主要分為 啟用遷移(enable-migrations) 和 執行遷移(add-migration, update-database) 兩大步驟。

權責申明

Prolog教程 6 規則

pred x pred y pred z 前面我們已經說過,謂詞是使用一系列的子句來定義的。以前我們所學習的子句是事實,現在讓我們來看看規則吧。規則的實質就是儲存起來的查詢。它的語法如下 head body 其中,head 是謂詞的定義部分,與事實一樣,也包括謂詞名和謂詞的引數說明。連線符,一般可以...

Python 教程 6 模組

如果你從python直譯器退出並再次進入,之前的定義 函式和變數 都會丟失。因此,如果你想編寫乙個稍長些的程式,最好使用文字編輯器為直譯器準備輸入並將該檔案作為輸入執行。這被稱作編寫 指令碼 隨著程式變得越來越長,你或許會想把它拆分成幾個檔案,以方便維護。你亦或想在不同的程式中使用乙個便捷的函式,而...

Python OpenCV教程6 閾值分割

固定閾值分割很直接,一句話說就是畫素點值大於閾值乙個值,小於閾值是另外乙個值。灰度圖讀入 閾值分割 ret,th cv2.threshold img,127,255,cv2.thresh binary cv2.imshow thresh th cv2.waitkey 0 cv2.threshold ...