4

我正在爲MVC 5項目使用EF 6(代碼第一次遷移)。在我本地的DEV機器上一切正常。Azure + EF 6 - 使代碼第一次遷移工作

但是當我部署我的項目天青,我收到以下錯誤,當我的應用程序首先嚐試與數據庫進行交互:

Migrations is enabled for context 'UtilitiesContext' but the database does not exist or 
contains no mapped tables. Use Migrations to create the database and its tables, for 
example by running the 'Update-Database' command from the Package Manager Console. 

我在Utilities.Data組裝我的EF相關的代碼,我的MVC項目在Utilities.Web程序集中。

這是我送給你的參考代碼:

UtilitiesContext.cs

public sealed partial class UtilitiesContext : DbContext 
{ 
    public UtilitiesContext() : base(Settings.Get(Settings.DB_CONNECTION_STRING)) { } 

    public DbSet<PreLaunchSubscriber> PreLaunchSubscribers { get; set; } 

    private void SetCreatedAtUpdatedAt() 
    { 
     foreach (DbEntityEntry entityEntry in ChangeTracker.Entries()) 
     { 
      switch (entityEntry.State) 
      { 
       case EntityState.Added: 
        ((IEntity) entityEntry.Entity).CreatedAt = DateTime.Now; 
        break; 
       case EntityState.Modified: 
        ((IEntity) entityEntry.Entity).UpdatedAt = DateTime.Now; 
        break; 
      } 
     } 
    } 

    [HandleException] 
    public override int SaveChanges() 
    { 
     SetCreatedAtUpdatedAt(); 
     return base.SaveChanges(); 
    } 

    [HandleException] 
    public override Task<int> SaveChangesAsync() 
    { 
     SetCreatedAtUpdatedAt(); 
     return base.SaveChangesAsync(); 
    } 
} 

Configuration.cs

internal sealed class Configuration : DbMigrationsConfiguration<UtilitiesContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = true; 
     ContextKey = "Utilities.Data.Contexts.UtilitiesContext"; 
    } 

    protected override void Seed(UtilitiesContext context) 
    { 
     // This method will be called after migrating to the latest version. 

     // You can use the DbSet<T>.AddOrUpdate() helper extension method 
     // to avoid creating duplicate seed data. E.g. 
     // 
     // context.People.AddOrUpdate(
     //  p => p.FullName, 
     //  new Person { FullName = "Andrew Peters" }, 
     //  new Person { FullName = "Brice Lambson" }, 
     //  new Person { FullName = "Rowan Miller" } 
     // ); 
     // 
    } 
} 

Settings.cs

public static class Settings 
{ 
    public const string DB_CONNECTION_STRING = "DB.ConnectionString"; 

    // other settings ... 

    public static string Get([Required] string key) 
    { 
     return CloudConfigurationManager.GetSetting(key); 
    } 
} 

而在App Settings部我在本定義的Configuration標籤:

鍵:DB.ConnectionString

值:數據源= TCP:host.database.windows.net, 1433; Initial Catalog = Utilities; User Id = user @ server; Password = pwd;

+0

您是否在global.asax中添加了'DropCreateDatabaseIfModelChanges (){}'? – Eiaddar

+0

@ Eddy4v不,我沒有。我需要嗎?它不在那裏,它仍然在我的DEV圖像。 – Moon

+0

即便如此,你必須使用更新的數據庫 來更新數據庫扔包管理器控制檯,並確保您的連接字符串名稱相同的語境名女巫是** ** UtilitiesContext – Eiaddar

回答

3

看起來您遇到的問題是您將應用程序部署到了Azure,但它試圖定位的數據庫尚不存在。

生產代碼的最佳解決方案是從本地計算機上的包管理器控制檯運行以下命令,這將生成一個sql腳本,您可以針對生產數據庫運行該腳本以使其與應用程序保持同步。

PM> Update-Database -script -sourceMigration 0 

或者如果你只是想在Azure中MigrateDatabaseToLatestVersion初始化會做你的需要,並確保你的數據庫是最新的,只要您的應用程序開始測試。通常不建議使用初始化程序生產代碼,因爲更改生產數據庫應該非常小心。

This blog post有點舊,但在初始化和遷移兩方面都做得很好。

+0

如果目標數據庫是EMPTY,該怎麼辦?當我發佈到Azure時,它只更新App_Data文件夾中的mdf(但Azure不允許SQL Express),並且配置連接字符串被SQL實例正確覆蓋。但該數據庫仍然是空的。我無法弄清楚如何使用ef6和這些更新數據庫工具爲數據庫創建一個創建腳本(或從空的遷移)。 PITA!謝謝! –

1

如果您已經在Azure中設置了數據庫,並且它包含您的一些模型但尚未進行上次更改,那麼在發佈到Azure時,請選中「執行代碼優先遷移(在應用程序啓動時運行)」,發佈嚮導的「設置」部分。

注意:如果您直接瀏覽使用已更改模型的頁面並引發錯誤,請訪問應用程序的頁面,即使用自上次以來未更改的部分模型發表!

此過程適用於EF 6.0的我。2和VS 2013

相關問題