Entity framework 4 使用实体框架迁移的种子设定和分支项目
我正在做一个项目,使用EntityFramework代码First4.3,使用迁移。 在本地运行时,my web.config被配置为以实现Entity framework 4 使用实体框架迁移的种子设定和分支项目,entity-framework-4,entity-framework-4.3,entity-framework-migrations,Entity Framework 4,Entity Framework 4.3,Entity Framework Migrations,我正在做一个项目,使用EntityFramework代码First4.3,使用迁移。 在本地运行时,my web.config被配置为以实现CreateDatabaseIfNotExists的数据库初始值设定程序为目标,该初始值设定程序使用测试数据为我的开发数据库种子,但在第一次运行时还填充各种“静态”可查找数据 创建开发数据库后,对数据库的任何后续更改都将完成,向项目添加迁移,并使用“updatea database”PS命令更新数据库 当我对project感到满意时,我会使用webdeplo
CreateDatabaseIfNotExists
的数据库初始值设定程序为目标,该初始值设定程序使用测试数据为我的开发数据库种子,但在第一次运行时还填充各种“静态”可查找数据
创建开发数据库后,对数据库的任何后续更改都将完成,向项目添加迁移,并使用“updatea database”PS命令更新数据库
当我对project感到满意时,我会使用webdeploy部署代码,但会手动复制数据库,因为webdeploy不包括迁移表。部署时,我使用web.config转换来设置新的数据库初始值设定项,该初始值设定项实现了MigrateDatabaseToLatestVersion
。这将应用随后部署的新的基于代码的迁移。
这一切都运行得相当好,但我担心这是否是初始化数据库的最佳方法,不仅使用测试数据,而且使用运行应用程序所需的数据。
我要寻找的是一种创建初始种子数据的好方法,无需将其挂接到createDatabaseIfnoteExists
,而是将其挂接到迁移中。
我意识到在配置类上有一个seed方法,但由于每次迁移都会更新数据库,所以这不是理想的解决方案
该项目是在TFS和不时我需要创建一个新的分支,这个项目是本质上是第一个克隆。当第一次在本地运行此操作时,数据库还不存在,但将按照前面的说明创建和播种数据库。现在最大的问题是,以前通过迁移处理的模式更改现在将在第一次创建数据库时应用。如果我尝试添加一个新的迁移文件并运行“更新数据库”,我会遇到问题,因为它无法运行以前的迁移,因为在创建数据库时已经应用了这些更改。我只能想象我在这里做错了什么,或者只是错过了一个把戏
总之,我正在寻找有关
迁移配置有
Seed
方法,该方法正是为了解决这个问题而存在的。在此方法中,您可以使用AddOrUpdate
扩展方法初始化核心数据。扩展方法将首先检查数据库中是否已存在记录,然后更新它或插入新记录。我觉得使用Seed方法初始化数据库对于非常小和简单的数据集来说是错误的。原因是,正如你所说,它只是运行得太频繁。我们已经将数据初始化从应用程序中移到安装过程中。我们刚刚构建了一组使用普通实体框架代码来创建所需数据的方法。这样,我们就不必担心性能问题,可以更轻松地编写验证数据创建代码的测试
为了在开发期间初始化数据库,我们有一组单元测试,它们将运行与安装程序相同的代码。开发人员只需运行单元测试,他们的数据库就会正确初始化。我知道提到的seed方法。我对使用它的担心是,它在每次运行迁移时都会执行。在应用程序运行时,我的一些初始核心数据会/可能会通过应用程序进行更改,如果添加了新的迁移,我不希望它重置。如果您有一个很好的方法在配置类中包装Seed方法,这样它只在'InitialCreate'迁移时执行,我想它会起作用,但我还没有找到任何好的方法。您有责任确保调用
Seed
方法是可重复的-AddOrUpdate
可以帮助您完成。如果您无法确保在迁移中直接向Up
方法添加自定义种子SQL语句。我理解您的意思,但使用entity framework的众多原因之一是避免编写可能相对复杂的SQL insert语句。而不是通过上下文播种。我正在研究另一种解决方案,并将发布一次/如果检查出有效。