close

基本的步驟跟著 http://msdn.microsoft.com/en-US/data/jj591621 沒錯

 

其中 DbMigration 裡的Up method 是用來升版 , Down 則是降版

 

異動PK欄位

如果異動到的欄位是 Primary Key , 例如更改PK欄位的長度

他自動產生出來的語法是有問題的

因為正常的SQL如果是FK欄位或PK欄位都有加 CONSTRAINT 是沒有辦法直接修改欄位的

要先把PK或FK或Index移掉,才有辦法修改欄位長度.

等改完欄位長度再把原本的PK加回去.

 

例如,有一個Table AAA 裡面的PK叫 akey,原本的長度是255要改成50的話

自動產生的語法只會有

AlterColumn("dbo.AAA ", "akey",c=> c.String(nullable: false, maxLength: 50));

這樣一執行Update-Database 就會出錯,會有下面的錯誤訊息

The object 'PK_AAA' is dependent on column 'akey'.
ALTER TABLE ALTER COLUMN akey failed because one or more objects access this column.

 

把程式改成

DropPrimaryKey("dbo.AAA", "akey");
AlterColumn("dbo.AAA ", "akey",c=> c.String(nullable: false, maxLength: 50));
AddPrimaryKey("dbo.AAA", "akey");

就可以解決

 

異動FK欄位

但是如果改的是FK欄位..事情就沒有這麼簡單了

例如,有二個 Table AAA,BBB, Table AAA的PK叫 akey ,有個FK bkey 關連到Table BBB的key欄位 bkey

這時要改Table BBB的key 欄位長度從255改成 50

一樣自動產生出來的語法只會有

AlterColumn("dbo.BBB ", "bkey",c=> c.String(nullable: false, maxLength: 50));

 

這樣一執行Update-Database 就會出錯,除了上面的例子的錯誤訊息

The object 'PK_AAA' is dependent on column 'bkey'.
ALTER TABLE ALTER COLUMN bkey failed because one or more objects access this column.

還會有另一個

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_dbo.AAA_dbo.BBB_key". The conflict occurred in database "xxxDB", table "dbo.AAA", column 'bkey'.

 

要改成

DropForeignKey("dbo.AAA", "FK_dbo.AAA_dbo.BBB_bkey");
AlterColumn("dbo.AAA", "bkey", c => c.String(nullable: false, maxLength: 50));
DropPrimaryKey("dbo.BBB", "PK_dbo.BBB");
AlterColumn("dbo.BBB", "bkey", c => c.String(nullable: false, maxLength: 50));
AddPrimaryKey("dbo.BBB", "bkey");
AddForeignKey("dbo.AAA", "bkey", "dbo.BBB", "bkey");

 

把2個table 的FK跟PK都先drop才能改.

注意一點

DropForeignKey ("dbo.AAA", "FK_dbo.AAA_dbo.BBB_bkey");  <-這裡是在資料庫裡真正的FK的名字不是欄位名字

但是 AddForeignKey 卻是欄位的名稱

 

如果是異動到的欄位有 Index  也是差不多的情形,要先把index drop 掉

一樣要注意, DropIndex 參數的名稱是在資料庫裡真正index的名稱(通常是IX開頭) 不是欄位名稱

 

把異動放到正式環境

最後怎麼把這些異動放到真正的production 環境,畢竟剛剛這些是都是在開發環境裡作的

在指令  Update-Database 後面加上  -Script -SourceMigration: 來源版本 -TargetMigration: 目地版本

例如

Update-Database -Script -SourceMigration: xxx1 -TargetMigration: xxx2

 

就會產生sql script在visual studio 裡的視窗裡了

 

把這些script copy到production環境裡執行就可以囉

arrow
arrow
    全站熱搜

    丫烈客 發表在 痞客邦 留言(0) 人氣()