本篇文章我們會使用 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),這樣可以生成乙個新的資料庫,方便做實驗。
"下面就啟用code first migrations來解決資料庫更新的問題。accountcontext
" connectionstring="
data source=.;database=mvcdemo2;uid=sa;pwd=123456;attachdbfilename=|datadirectory|\mvcdemo2.mdf;
" providername="
system.data.sqlclient
" />
開啟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下面我們就執行正式遷移。開啟package manager console,輸入 update-databasepartial
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");}}
update-database指令呼叫了up方法來新建database的表(和data model entity set對應), 然後呼叫seed方法來填充測試資料。
這個時候開啟資料庫看下,完全符合我們的預期。
再進一步,我們新增乙個表organize,先新增乙個model
public修改accountcontext.cs, 增加乙個data model entity setclass
organize
//////
組織名稱
/// public
int organizename
}
執行add-migration addtesttable和update-database, 完成資料庫表的新增。
去資料庫中檢查,發現已經多了organize這張表了
新增表之後,我發現表organize少加了乙個欄位parentid,欄位organizename的型別需要修改為字串型別,修改organize實體類
///執行add-migration addtesttable和update-database, 完成資料庫表的修改。///組織名稱
/// public
string organizename
//////
上級組織id
/// public
int parentid
最後再檢查下新產生的配置檔案
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 ...