[英]Entity Framework - Code First Approach
我只是在我的項目中遵循實體框架代碼的第一種方法,我遇到了一些問題。 總是我被迫使用命令重新生成數據庫。 然而,現在我成功地保持穩定。 我有一個場景,在這個,框架創建一個遷移腳本是不合邏輯的,可能是我錯過了一些東西,需要你的幫助
場景是 - 我啟用了遷移,並且它創建了一個包含所有表格設置的InitialCreate類,我對此印象非常深刻。 但是當我在實體中進行更改時,例如,我有Deal Class
我添加了名為LenderName,BorrowerName的新屬性,並運行了添加遷移腳本,它為我創建了一個遷移腳本,
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()函數失敗,因為它嘗試從表中刪除列。 為什么Microsoft要添加該刪除腳本,開發人員是否需要手動刪除? 請幫忙
這里的提示是Discriminator
列。 EF應用默認策略來實現繼承,稱為TPH,Table-Per-Hierarchy。 當您在實體之間具有繼承時,EF將自動生成Discriminator
字段。
您似乎在模型中進行了更多更改,而不是將這兩個屬性添加到現有實體:您可能將它們從派生類移動到基類,或者相反的方式。 此外,您的DbContext
似乎只包含基本實體或派生實體的DbSet
,但兩者都不包含。 請注意,默認情況下,遷移僅包括DbContext
中包含的實體作為DbSets
(您還可以在映射中顯式包含或排除它們)。 因此,您的遷移僅在DbContext
生成實體的字段,而不是為另一個生成,EF正在解釋您刪除了這些屬性,這就是您獲得DropColumn
句子的原因。
所以這里的解決方案是將缺少的DbSet
添加到DbContext
並再次生成遷移。
在這里您可以獲得有關TPH的更多信息。
一個不同的解釋可能是,在多次運行Update-Database
和Add-Migration
並使用-force
參數后,您的數據庫處於與__MigrationHistory
表的內容不一致的狀態。 我的建議是手動刪除數據庫,如果可能的話,生成一個干凈的Initial
遷移並運行它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.