我已经为此绞尽脑汁好几个小时了,但似乎无法弄清楚出了什么问题。
这是我们的项目基本设置:
- 具有 ASP.NET 成员(member)资格的 MVC 3.0 项目
- Entity Framework 4.3,代码优先方法
- 本地环境:带有 2 个 MDF 数据库文件的本地 SQL Server(aspnet.mdf +Entity.mdf)
- 服务器环境:Windows Azure + 2 个 SQL Azure 数据库(aspnet 和实体)
这就是我们所做的:
- 创建了本地和远程数据库,修改了 web.config 以在 Debug模式下使用 SQLEXPRESS 连接字符串,在 Release模式下使用 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 环境中存在一个未知错误:
- 我们有几个派生自父类(super class)
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
表有列Foo
和Foo1
。逻辑足够了,因为SuperClass
有 2 个子类SubClass1
和SubClass2
,每个都有Foo
属性(property)。在我们的例子中,Foo
为 NULL 但Foo1
有一个int32
值(value)。所以问题不在于数据库 - 相反,我们的模型和数据库之间的链接似乎已经丢失。鉴别器逻辑已损坏。
- 我们有几个派生自父类(super class)
在尝试寻找可能出现问题的迹象时,我们注意到了几件事:
- 尽管我们从未在 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 实体数据库上执行过任何迁移,但该数据库现在具有
这是我们的理解
- 由于某种原因,SQL Azure 删除并重新创建了我们的数据库
- 在此过程中创建了 _MigrationHistory 表,注册了一个起点来测试模型以用于将来的迁移
这是我们的问题
- 谁/什么触发了数据库删除/重新创建?
- EF 如何重新播种
Application_Start
以来的样本数据有System.Data.Entity.Database.SetInitializer<Entities>(null);
?
编辑:看看可能出了什么问题,我们注意到在此 SQL Azure 中我们没有尊重的一件事 tutorial :我们没有删除 PersistSecurityInfo
创建数据库后,从我们的 SQL Azure 实体数据库连接字符串中获取。不明白为什么它会导致这个问题,但仍然值得一提......
最佳答案
没关系,找到了问题的原因。如果有人想知道的话:自从添加预处理器指令以来,我们还没有进行任何 Azure 部署。 MS 必须重新启动我们的虚拟机所在的计算机,并且新虚拟机使用查看数据重新创建了数据库。
经验教训:始终进行频繁的 Azure 部署。
关于azure - SQL Azure 意外数据库删除/重新创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10108659/