4

MVC 5 プロジェクトに EF 6 (移行を伴うコードファースト) を使用しています。私のローカル DEV マシンでは、すべて正常に動作します。

しかし、プロジェクトを Azure にデプロイすると、アプリが最初にデータベースと対話しようとしたときに、次のエラーが発生します。

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" }
        //    );
        //
    }
}

設定.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;初期カタログ=ユーティリティ;ユーザー ID=user@server;パスワード=pwd;

4

2 に答える 2

3

発生している問題は、アプリケーションを Azure にデプロイしたことですが、ターゲットにしようとしているデータベースがまだ存在していないようです。

運用コードの最適なソリューションは、ローカル マシンのパッケージ マネージャー コンソールから次のコマンドを実行することです。これにより、運用データベースに対して実行できる SQL スクリプトが生成され、アプリケーションでデータベースを最新の状態にできます。

PM> Update-Database -script -sourceMigration 0

または、azure でテストするだけの場合は、MigrateDatabaseToLatestVersion 初期化子が必要なことを行い、アプリが起動されるたびにデータベースが最新であることを確認します。本番データベースの変更は非常に慎重に行う必要があるため、一般に、本番コードでイニシャライザを使用することはお勧めしません。

このブログ投稿は少し古いですが、初期化子と移行の両方の概要を説明しています。

于 2013-10-28T19:02:33.710 に答える