2

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


这是我们的项目基本设置:

  • 具有 ASP.NET 成员资格的 MVC 3.0 项目
  • 实体框架 4.3,代码优先方法
  • 本地环境:带有 2 个 MDF 数据库文件的本地 SQL Server(aspnet.mdf + entity.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 环境中的每个应用程序启动时停止破坏实体数据库:

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


这就是它变得丑陋的地方

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

    • 我们有几个派生自超类的类SuperClass
    • 相应的实体表将所有这些对象存储在同一个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 Entity 数据库执行任何迁移,但该数据库现在有一个_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_Start自从has以来,EF 如何重新播种我们的样本数据System.Data.Entity.Database.SetInitializer<Entities>(null);

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

4

1 回答 1

0

没关系,找到了我们问题的原因。万一有人想知道:自从添加了预处理器指令以来,我们还没有进行任何 Azure 部署。MS 必须重新启动我们的 VM 所在的机器,并且新的 VM 使用 see data 重新创建了数据库。

经验教训:始终进行频繁的 Azure 部署。

于 2012-04-14T00:48:35.127 回答