2013-05-15 62 views
0

我想將遷移應用到我的數據庫。無法應用遷移

最初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人。

+1

雖然不完全是對整個問題的答案,但隨着遷移的逆向工程也引起了一些麻煩。在這裏看到我的問題和一個很好的答案可能會有所幫助:http://stackoverflow.com/questions/17736708/unable-to-run-ef5-migration-with-existing-database – Steve

+0

基本上,反向工程DB,添加一個EMPTY遷移和呼叫更新數據庫。 – Steve

回答

0

您是否打算重命名您的上下文類而不是數據庫中的表?

重新生成上下文,然後在重構/重命名代碼之前添加[TableName(「tbl_ContextClassName」)]屬性。

我的猜測是,如果數據庫不是你的要更改的,那麼只有在所有類名稱和屬性名稱的屬性名都設置了其數據庫名稱後纔可能重構 - 這是爲了避免從「convention over configuration」當你重命名一個類時重命名該表,如果重命名屬性,則重命名列。