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 程序集中。

这是我的代码供您参考:

实用程序上下文.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();
    }
}

配置.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;初始目录=Utilities;用户ID=user@server;密码=pwd;

4

2 回答 2

3

您遇到的问题似乎是您将应用程序部署到 Azure,但它尝试定位的数据库尚不存在。

生产代码的最佳解决方案是从本地计算机上的包管理器控制台运行以下命令,这将生成一个 sql 脚本,您可以针对生产数据库运行该脚本以使其与您的应用程序保持同步。

PM> Update-Database -script -sourceMigration 0

或者,如果您只想在 azure 中进行测试,MigrateDatabaseToLatestVersion 初始化程序将执行您需要的操作,并确保您的数据库在您的应用程序启动时是最新的。通常不建议在生产代码中使用初始化程序,因为更改生产数据库需要非常小心。

这篇博文有点旧,但很好地概述了初始化程序和迁移。

于 2013-10-28T19:02:33.710 回答
1

如果您已经在 Azure 中设置了数据库并且它包含您的一些模型但还没有您最后的更改,那么在发布到 Azure 时,请选中“设置”部分中的“执行代码优先迁移(在应用程序启动时运行)”发布向导。

注意:如果您直接浏览到使用更改后的模型的页面,并引发错误,请访问您的应用程序的页面,该页面使用的是自上次发布以来未更改的模型的一部分!

此过程适用于我的 EF 6.0.2 和 VS 2013

于 2014-01-23T04:43:38.927 回答