几个小时以来,我一直在摸不着头脑,但似乎无法弄清楚出了什么问题。
这是我们的项目基本设置:
- 具有 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
表有列Foo
和Foo1
。足够合乎逻辑,因为SuperClass
有 2 个子类SubClass1
和SubClass2
,每个子类都有一个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 Entity 数据库执行任何迁移,但该数据库现在有一个
这是我们的理解
- 出于某种原因,SQL Azure 删除并重新创建了我们的数据库
- _MigrationHistory 表是在此过程中创建的,它注册了一个起点来测试模型以供将来迁移
这是我们的问题
- 谁/什么触发了数据库删除/重新创建?
Application_Start
自从has以来,EF 如何重新播种我们的样本数据System.Data.Entity.Database.SetInitializer<Entities>(null);
?
编辑:看看可能出了什么问题,我们注意到在这个 SQL Azure教程中我们不尊重的一件事:我们没有PersistSecurityInfo
在创建数据库后从我们的 SQL Azure 实体数据库连接字符串中删除。不明白为什么在地球上它可能会导致问题,但仍然值得一提......