SQL Azure意外数据库删除/重新创建

时间:2012-04-11 15:02:16

标签: azure ef-code-first azure-sql-database ef-migrations

我一直在摸不着头几个小时,但似乎无法弄清楚出了什么问题。


以下是我们的项目基本设置:

  • 具有ASP.NET成员资格的MVC 3.0项目
  • 实体框架4.3,代码优先方法
  • 本地环境:附加了2个MDF数据库文件的本地SQL Server(aspnet.mdf + entities.mdf)
  • 服务器环境:Windows Azure + 2个SQL Azure数据库(aspnet和实体)


以下是我们的工作:

  • 创建本地和远程数据库,修改web.config以在调试模式下使用SQLEXPRESS连接字符串,在发布模式下使用SQL Azure连接字符串
  • 使用SampleData方法创建了一个DropCreateDatabaseAlways<Entities>类扩展Seed以播种数据。
  • System.Data.Entity.Database.SetInitializer(new Models.SampleData());中使用Application_Start将数据播种到我们的数据库。
  • 在本地使用应用程序 - 创建表并播种,一切正常。
  • 已部署,运行远程应用程序 - 已创建表并播种,一切正常。
  • 添加了预处理器指令,以便在我们的远程Azure环境中的每个应用程序启动时停止销毁Entity数据库:

    #if DEBUG
        System.Data.Entity.Database.SetInitializer(new Models.SampleData());
    #else
        System.Data.Entity.Database.SetInitializer<Entities>(null);
    #endif
    


这是丑陋的地方

  • 我们使用NuGet启用了迁移,AutomaticMigrationsEnabled = true;
  • 一切都运行顺畅而美好。我们把它煮了几天
  • 今天,我们注意到Azure环境中存在一个未知错误:

    • 我们有几个派生自超类SuperClass
    • 的类
    • 相应的Entity表将所有这些对象存储在同一SuperClass表中,使用鉴别器知道在加载各个类时要从哪个列进行输入
    • 虽然在今天之前装载的情况还不错,但它已经不复存在了。我们收到以下错误消息:

      The 'Foo' property on 'SubClass1' could not be set to a 'null' value. You must set this property to a non-null value of type 'Int32'.
      
    • 经过快速检查后,我们的SuperClass表格列为FooFoo1。足够逻辑,因为SuperClass有2个子类SubClass1SubClass2,每个子类都有Foo属性。在我们的示例中,Foo为NULL,但Foo1的值为int32。所以问题不在于数据库 - 相反,我们的模型和数据库之间的链接似乎已经丢失了。鉴别器逻辑已损坏。
  • 试图找出可能出错的迹象,我们注意到了几件事:

    • 即使我们从未在SQL Azure实体数据库上执行任何迁移,数据库现在也有_MigrationHistory
    • _MigrationHistory表有一条记录:

      MigrationID: 201204102350574_InitialCreate
      CreatedOn: 4/10/2012 11:50:57 PM
      Model: <Binary data>
      ProductVersion: 4.3.1
      
    • 查看其他表格时,大多数表格在迁移发生时都被清空了。只有最初种有SampleData的表格仍未受影响。

    • 使用SQL Azure管理门户检入,我们的实体数据库显示以下创建日期:2012年4月10日23:50:55。


以下是我们的理解

  • 出于某种原因,SQL Azure删除并重新创建了我们的数据库
  • 在此过程中创建了_MigrationHistory表,为未来的迁移注册了测试模型的起点


以下是我们的问题

  • 是谁/什么触发了数据库删除/娱乐?
  • 由于Application_StartSystem.Data.Entity.Database.SetInitializer<Entities>(null);
  • ,EF如何重新设定我们的样本数据?

编辑:看看可能出现的问题,我们注意到在这个SQL Azure tutorial中我们没有尊重的一件事:我们没有删除PersistSecurityInfo创建数据库后,从我们的SQL Azure实体数据库连接字符串。不明白为什么地球上可能会引起这个问题,但仍然值得一提......

1 个答案:

答案 0 :(得分:0)

没关系,找到了我们问题的原因。如果有人想知道:自从添加预处理器指令以来,我们没有进行任何Azure部署。 MS必须重新启动VM驻留的计算机,新VM使用查看数据重新创建数据库。

获得的经验:总是经常进行Azure部署。