entity framework update 實體框架代碼優先:遷移失敗,更新數據庫,強制不必要(?)添加遷移




postgresql entity framework (3)

我使用遷移(EF 5.0)和代碼優先有一個有趣的效果:

我用GUID主鍵創建了一些模型。 (順便說一句:對我來說很重要,SQL Server使用NEWSEQUENTIALID() ,這似乎是當前版本中的默認值)

在某些時候,我激活了遷移。 我在初始遷移中添加了一些代碼,這主要是.Index()

當我刪除數據庫並調用update-database時,出現以下錯誤:

無法更新數據庫以匹配當前模型,因為存在掛起的更改並且已禁用自動遷移。 將掛起的模型更改寫入基於代碼的遷移或啟用自動遷移。 將DbMigrationsConfiguration.AutomaticMigrationsEnabled設置為true以啟用自動遷移。 您可以使用Add-Migration命令將掛起的模型更改寫入基於代碼的遷移。

我嘗試過AutomaticMigrationsEnabled = true ,無需更改或添加任何內容即可使用!

但由於我不想要AutomaticMigrationsEnabled ,我還嘗試再次刪除數據庫,稱為update-database ,然後add-migration 。 我最終得到了一個似乎沒有改變任何東西的額外遷移(見下文)。 我也嘗試將這些行添加到初始遷移的底部 - 但這並沒有改變任何東西。

其中一個型號:

[Table(Speaker.TABLENAME)]
public class Speaker : BaseModel
{
    public const String TABLENAME = "Speaker";

    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

    [Required]
    [MaxLength(50, ErrorMessage = "Name must be 50 characters or less")]
    public string Name { get; set; }
}

初始遷移代碼:

public partial class InitialCreate : DbMigration
{
    public override void Up()
    {
        // [...]
        CreateTable(
            "dbo.Speaker",
            c => new
                {
                    Id = c.Guid(nullable: false, identity: true),
                    Name = c.String(nullable: false, maxLength: 50),
                })
            .PrimaryKey(t => t.Id)
            .Index(t => t.Name, true, false);   // added manually: unique Name
        // [...]
    }
}

internal sealed class Configuration : DbMigrationsConfiguration<MyProject.Repositories.DBContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }

    protected override void Seed(MyProject.Repositories.DBContext context)
    {
        // ...
    }
}

下面是add-migration創建的代碼:它似乎沒有做任何新的東西 - 也許我錯過了什麼?

public partial class UnneccessaryMigration : DbMigration
{
    public override void Up()
    {
        // isn't this the exact same code from InitialMigrations?
        AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false, identity: true));
        // ...
    }

    public override void Down()
    {
        //...
        AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false));
    }
}

所以我很好奇:我做了什麼來迷失遷移? 如果只使用一次初始遷移,我該怎麼辦呢?

解決方案 :以下解決方法為我做了:

  1. 我刪除了數據庫和所有遷移,如下所述: https://stackoverflow.com/a/11679386/3168401 ://stackoverflow.com/a/11679386/3168401
  2. 執行啟用 - 遷移+添加遷移初始
  3. 合併我的手工.Index()更改到文件中。 現在Update-Database再次工作 - 在刪除數據庫時也是重複的。

我還嘗試再次刪除數據庫,稱為update-database,然後添加遷移。 我最終得到了一個似乎沒有改變任何東西的額外遷移(見下文)

基於以上細節,我認為你先做了最後一件事。 如果在Add-migration之前運行Update database ,則不會使用遷移模式更新數據庫。 首先,您需要添加遷移,然後運行update命令。

使用包管理器控制台按此順序嘗試它們。

PM> Enable-migrations //You don't need this as you have already done it
PM> Add-migration Give_it_a_name
PM> Update-database

實體框架在身份字段方面確實存在一些問題。

您無法在現有表上添加GUID標識

遷移:不檢測對DatabaseGeneratedOption的更改

反向工程不會將具有默認NEWSEQUENTIALID()的GUID鍵標記為存儲生成的標識

這些都沒有完全描述您的問題,並且額外遷移中的Down()方法很有趣,因為當初始遷移中的CREATE TABLE似乎設置它時,它似乎試圖從列中刪除I​​DENTITY!

此外,如果您使用Update-Database -ScriptUpdate-Database -Verbose來查看從這些AlterColumn方法運行的sql,您將看到sql在UpDown是相同的,並且實際上什麼都不做。 IDENTITY保持不變(對於當前版本 - EF 6.0.2及更低版本) - 如我鏈接的前兩個問題所述。

我認為您應該刪除額外遷移中的冗餘代碼,並暫時使用空遷移。 您可以訂閱/投票支持要解決的問題。

參考文獻:

更改IDENTITY選項確實蹲下了

使用自定義遷移操作打開/關閉標識


嘗試這個:

PM> Enable-migrations -force
PM> Add-migration MigrationName
PM> Update-database -force




ef-migrations