基本的步驟跟著 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環境裡執行就可以囉
留言列表