簡體   English   中英

實體框架 - 代碼優先方法

[英]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-DatabaseAdd-Migration並使用-force參數后,您的數據庫處於與__MigrationHistory表的內容不一致的狀態。 我的建議是手動刪除數據庫,如果可能的話,生成一個干凈的Initial遷移並運行它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM