2015-01-09 54 views
2

快速问题是“如何让我的Azure数据库与本地数据库同步?”丢失的迁移和Azure数据库现在不同步

详情: 我一直在使用实体框架在我的项目,这真的不从ASP.NET MVC 5示例项目,其中有内置的身份2不同

有两个数据库环境中,一个从Identity调用ApplicationDbContext(aspnet_somethingUserDB),另一个调用StoreInitialTestContext(store_db)。

有趣的是,我将这些上下文中的每一个都放在一个单独的SQL数据库本地中,并且它们只位于一个数据库中,称为Azure服务上的store_db。

事情正在顺利进行,并且两个本地数据库(它们与Azure上的单个数据库具有相同的表补充)保持同步。该网站在本地进行调试和在Azure上运行良好。

通过添加模型对模式进行最后更改后,我执行了update-database命令并更新了本地数据库。不幸的是,当我将网站发布到Azure时,通过“run code-first migrations ...”选择上下文和选中标记后,Azure数据库未更新。

看着我的代码,我没有看到任何正在等待的迁移,所以我不确定如何让Azure数据库恢复同步。

作为最后的努力,我将Azure数据库从Basic设置为Standard,并使用我的本地store_db和Azure store_db之间的compare schema命令。我确保只有通过取消选中与aspnet_UsersomethingDb相关的表才能更新本地store_db中的表。

该操作没有成功,所以我试图撤消对本地问题所做的更改,以及哪些未在Azure上应用。

这也不成功,所以我调整了我的网站,以避免EntityFramework“模型与数据库差异”崩溃,以至于它至少会跛行。

在这一点上,我的本地数据库是好的,但关闭了“代码第一迁移”复选框,在Azure数据库报告:

“System.InvalidOperationException”类型的异常出现在的EntityFramework。 dll,但是 未在用户代码中处理

附加信息:自从创建数据库以来,支持'StoreInitialTestContext'上下文的模型已更改,因为 。考虑使用Code First Migrations来更新数据库 (http://go.microsoft.com/fwlink/?LinkId=238269)。

打开的复选框,该报告是:

类型“System.Data.SqlClient.SqlException”的异常出现在EntityFramework.dll但 在用户代码中处理

附加信息: 数据库中已有一个名为'ExtendedUserInformations'的对象。

这似乎表明,代码优先迁移想要添加对象以使事物同步,但该对象已存在。

是否有一个快速的方法让这些数据库同步? Azure中没有太多数据,所以如果必须的话,我可以导出一些记录并在重新创建数据库后重新加载它们。

您是否建议使用update-database并指定Azure连接字符串?

回答

2

我最终在这里做了什么可能不是最简单的方法来做到这一点,但它可能有助于某人。


首先,尽管他提出的是有趣的,但在我的情况下,大喊http://robertgreiner.com/2012/05/using-entity-framework-database-migrations-to-update-a-remote-database/没有工作。我应该已经意识到这一点,但也可以使用Azure连接字符串在Azure数据库上运行update-database命令。

请务必将您的数据库缩放到“标准”层或更高级别以避免命令超时和参差不齐的操作,'basic'和'web'不适用于任何“有用”的东西。数据库的“缩放” Azure的设置,往往你喜欢

人们可以得到由发布设置(右键点击你的项目复制和粘贴在Azure连接字符串,选择“发布”,然后选择“设置“)以及需要的-ConnectionProviderName是System.Data.Sqlclient,因此命令如下所示:

update-database -ConnectionString “Data Source = tcp:'your-sql-server'.database.windows.net,1433; Initial Catalog ='your-db-name'; 用户ID =用户名@ '你-SQL服务器';密码= 'SQL服务器-PWD'


的复杂性增加很多具有两个数据库环境中,ApplicationDbContext和矿山示例项目,StoreInitialTestContext。每个上下文都有一个本地数据库,但Azure上只有一个数据库,因此难以使用DropCreateDatabaseAlwaysDropCreateDatabaseIfModelChanges初始值设定项。

我最终编写了最大数据库表的内容,以便以后可以恢复它们。

接下来,我删除了整个Migrations目录,该目录有效地禁用迁移(正如此处所述,没有disable-migrations程序包管理器命令)。

接下来,我建立一个数据库初始化为StoreInitialTestContext,像这样:

public class StoreInitialTestContextInitializerCreate: DropCreateDatabaseAlways <StoreInitialTestContext> 
{ 
     protected override void Seed(StoreInitialTestContext context) 
     { 
     // nothing for now 
     } 
} 

此外,注册此作为适当的上下文数据库初始化:

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 

     // Drop the StoreInitialContext database and recreate if the model changes 
     Database.SetInitializer<StoreInitialTestContext>(new StoreInitialTestContextInitializerCreate()); 

这我用在下次运行网站时重新创建包含StoreInitialTestContext的数据库。

一旦本地数据库完全清理完毕,我就转移到Azure。

我去了门户网站并删除了数据库,以便下次我的网站在Azure上运行时可以重新创建它。

我确保发布配置文件中的设置已设置为更新数据库,但注意到代码优先迁移选项不可用。

下一次在Azure上运行该网站时,实体框架看不到数据库,因此它被创建。

我确保通过列出项目以及通过注册为用户来执行我自己的上下文项以及aspnet身份部分。检查Visual Studio中的SQL Server对象资源管理器确认所有表已创建。

接下来,是时候恢复表中的数据,但首先为了避免Azure错误,我将新创建的数据库(已创建为“已停用”的“Web”数据库层)设置为“Standard “层。

然后我将脚本逐个加载到Visual Studio中,将连接字符串用户名和密码输入到对话框中,然后运行脚本。

只有几张表需要更新,而且顺利进行,我准备迎接下一个挑战。

+0

这听起来太令人难以置信了,必须有一个更简单的解决方法来获取数据库同步。 我的情况是,我想更新数据库shema只有什么缺少。我从scrach(初始)重新创建本地EF迁移,但不想删除Azure数据库。那么我怎样才能进行迁移只为丢失的实体更改?当然,我可以手动编辑evru迁移文件,但我想要的是为了维护两个或更多的迁移文件集 - 对于本地和远程数据库(天蓝色)。 – Arvis