2016-11-20 258 views
4

我只是在我的項目中遵循實體框架代碼的第一種方法,而我陷入了一些問題。總是我被迫使用命令重新生成數據庫。然而,現在我設法得到這個穩定。我有一個場景,在這個框架是創建一個遷移腳本是不合邏輯的,可能是我缺少的東西,需要你的幫助,實體框架 - 代碼優先方法

該場景是 - 我已經啓用遷移,並創建了一個InitialCreate所有我的表設置,我對此印象深刻。但是當我在實體做出改變,例如,我有新政類

我添加了名爲LenderName,BorrowerName新的屬性和運行TEH附加遷移腳本,它創建了一個遷移腳本對我來說,

public partial class LenderBorrowerName : DbMigration 
    { 
     public override void Up() 
     { 
      DropColumn("dbo.Deals", "LenderName"); 
      DropColumn("dbo.Deals", "BorrowerName"); 
      DropColumn("dbo.Deals", "Discriminator"); 
     } 

     public override void Down() 
     { 
      AddColumn("dbo.Deals", "Discriminator", c => c.String(nullable: false, maxLength: 128)); 
      AddColumn("dbo.Deals", "BorrowerName", c => c.String()); 
      AddColumn("dbo.Deals", "LenderName", c => c.String()); 
     } 
    } 

問題是,原始數據庫沒有這個字段,並且通過這個遷移腳本,它假設添加到數據庫中。要更新這些字段,如果我運行update-migration -force,由於它嘗試從表中刪除列,因此它會因上述up()函數而失敗。爲什麼微軟正在添加該drop腳本,是開發人員需要手動刪除的?請幫忙

回答

0

這裏的提示是Discriminator列。 EF應用默認策略來實現繼承,該繼承稱爲TPH,Table-Per-Hierarchy。當您的實體之間存在繼承關係時,由EF自動生成Discriminator字段。

看來,你沒有在你的模型不是增加這兩個屬性到現有實體更多的變化:你可能搬到他們從派生類的基類,或周圍的正好相反。此外,您的DbContext似乎只包含DbSet用於基本實體或派生實體,但不適用於兩者。請注意,遷移在默認情況下僅包含DbContext中包含的實體,即DbSets(您也可以在映射中明確包含或排除它們)。因此,您的遷移僅爲您的DbContext中的實體生成字段,而不是另一個生成實體的字段,並且EF正在解釋您刪除了這些屬性,這就是爲什麼您會得到DropColumn句子。

所以這裏的解決方案是將缺少的DbSet添加到DbContext並再次生成遷移。

Here你可以有更多關於TPH的信息。

不同的解釋可能是運行Update-DatabaseAdd-Migration幾次,使用-force參數數據庫一直留在與您的__MigrationHistory表的內容不一致的狀態之後。我的建議是手動刪除數據庫,如果可能的話,生成一個乾淨的Initial遷移並運行它。

相關問題