我想將遷移應用到我的數據庫。無法應用遷移
最初DB被逆向工程代碼首先使用EF電源的工具。在我的數據庫中,表名都以tbl_ [NAME]開頭,所以在逆向工程過程完成後,所有模型都有相同的約定。由於模型名稱映射到modelMAP中的每個模型的表名,因此我決定在創建遷移並查看「UP」方法時重命名所有生成的模型以刪除「tbl_」,我可以看到EF希望在所有受影響的表上全部使用DropForeignKey,然後刪除表!什麼?
由於我的數據庫很大,我會展示的代碼只有幾行中遷移UP方法。
DropForeignKey("dbo.tbl_AssetFileLocations", "AssetFileID", "dbo.tbl_AssetFiles");
DropForeignKey("dbo.tbl_AssetFileLocations", "StorageLocationID", "dbo.tbl_StorageLocations");
...
DROP ALL FOREIGN KEYS ON ALL TABLES
...
DropIndex("dbo.tbl_AssetFileLocations", new[] { "AssetFileID" });
DropIndex("dbo.tbl_AssetFileLocations", new[] { "StorageLocationID" });
...
DROP ALL INDEXES
...
CreateTable(
"dbo.tbl_AssetFileLocations",
c => new
{
AssetLocationID = c.Guid(nullable: false),
AssetFileID = c.Guid(nullable: false),
StorageLocationID = c.Guid(nullable: false),
DateCreatedonStorage = c.DateTime(nullable: false),
})
.PrimaryKey(t => t.AssetLocationID)
.ForeignKey("dbo.tbl_AssetFiles", t => t.AssetFileID, cascadeDelete: true)
.ForeignKey("dbo.tbl_StorageLocations", t => t.StorageLocationID, cascadeDelete: true)
.Index(t => t.AssetFileID)
.Index(t => t.StorageLocationID);
...
CREATE ALL OTHER TABLES
...
DropTable("dbo.tbl_AssetFileLocations");
...
DROP ALL TABLES
...
我沒有數據庫中的數據所以雖然我不知道爲什麼EF已經決定放棄所有表並重新創建他們這是不是在我的實驗問題。不過,我想知道爲什麼改變模型名稱造成一個完整的數據庫重建嘗試時(新名稱映射到同一個表名作爲DB時,被逆向工程!)
我的主要問題
以圓形錯誤風暴結束遷移。
1日試圖給出錯誤: FK_dbo.tbl_AssetFileLocations_dbo.tbl_AssetFiles_AssetFileID」不是約束。 無法刪除約束。查看以前的錯誤。
所以我想好了,我會註釋掉DropForeignKey //DropForeignKey("dbo.tbl_AssetFileLocations」, 「AssetFileID」, 「dbo.tbl_AssetFiles」);
然後將其與相同的(上下文)錯誤下一dropForeignKey錯誤。因此,作爲一個實驗,我註釋掉了所有的DropForeignKey語句。
重新運行更新的數據庫命令,然後導致錯誤信息:
不能刪除索引「dbo.tbl_AssetFileLocations.IX_AssetFileID」,因爲它不存在,或者您沒有權限。
它一個接一個地抱怨所有的DropIndex語句。所以,作爲一個實驗我註釋掉所有並嘗試更新數據庫
所以我們可以看到,接下來的事情向上方法試圖做的是將所有的表!當然,我得到的錯誤: 數據庫中已經有一個名爲'tbl_AssetFileLocations'的對象。
所以我想好EF你在這裏是有點沉悶,你想在創建後刪除該表!所以我改變Drop table命令的順序,使它們在Create Table命令之前出現,因爲這樣做更有意義。
由於這只是與EF代碼第一和遷移它是所有很酷的實驗。我很高興EF能夠刪除整個數據庫模式並重建它。
因此與刪除表在正確的位置,現在的命令,我重新運行更新數據庫內得到最終的圓誤差:
無法刪除對象「DBO。tbl_Assets',因爲它被FOREIGN KEY約束引用。
,對自己,我認爲「對,就是外鍵約束,你拒絕在這個練習開始下降。
那麼,我從這裏走,從這個實驗中它會出現代碼 - 首先遷移不會對所有工作,但EF網站上簡單的例子給!
有沒有人逆向工程的大型數據庫,並取得了成功,在修改代碼並遷移那些數據庫?
我應該忘記代碼優先,並首先返回到數據庫(我寧願不 - 我首先喜歡代碼的想法)?
請幫助EF人。
雖然不完全是對整個問題的答案,但隨着遷移的逆向工程也引起了一些麻煩。在這裏看到我的問題和一個很好的答案可能會有所幫助:http://stackoverflow.com/questions/17736708/unable-to-run-ef5-migration-with-existing-database – Steve
基本上,反向工程DB,添加一個EMPTY遷移和呼叫更新數據庫。 – Steve