使用实体框架迁移的种子和分支项目

时间:2012-04-19 00:03:42

标签: entity-framework-4 entity-framework-4.3 ef-migrations

我正在使用实体框架代码开始使用迁移。 在本地运行时,我的web.config被配置为以数据库初始化为目标,该数据库初始化实现CreateDatabaseIfNotExists<DataContext>,它使用测试数据为我的开发数据库播种,但在第一次运行时也会填充各种“静态”可查找数据。

创建开发数据库后,对数据库进行的任何后续更改都会完成向项目的迁移,并使用'updata-database'PS命令更新数据库。

当我对项目感到满意时,我使用webdeploy部署代码,但手动复制数据库,因为webdeploy不包含迁移表。部署时,我使用web.config转换来设置实现MigrateDatabaseToLatestVersion<DataContext>的新数据库初始化程序。然后,这将应用之后部署的基于代码的新迁移。 这一切都运行得相当不错,但我担心这是否是初始化我的数据库的最佳方法,不仅包括测试数据,还包括运行应用程序所需的数据。 我正在寻找的是创建初始种子数据的好方法,而不必将其挂钩到CreateDatabaseIfNotExists<DataContext>,而是将其挂钩到迁移中。 我意识到在配置类上有种子方法,但是看到它在每次迁移时都在更新数据库,这不是理想的解决方案。

项目在TFS中,我不时需要创建这个项目的新分支,本质上是第一个的克隆。当第一次在本地运行时,数据库尚不存在,但将按照前面的说明创建和播种。现在最大的问题是,以前通过迁移处理的模式更改现在将在首次创建数据库时应用。如果我然后尝试添加新的迁移文件并运行“update-database”,我会遇到问题,因为它无法运行以前的迁移,因为在创建数据库时已经应用了这些更改。我只能想象我在这里做错了什么或者只是错过了一招。

总之,我正在寻找有关

的信息
  1. 种子初始测试数据的最佳方式&amp;使用迁移首次创建数据库时所需的应用程序数据。
  2. 在分支包含代码迁移的项目并且必须首次创建数据库时克服问题的最佳方法。
  3. 感谢阅读。

2 个答案:

答案 0 :(得分:1)

  

种子初始测试数据的最佳方式&amp;所需的应用数据   使用迁移首次创建数据库。

迁移配置具有Seed方法,该方法完全存在以解决此问题。在此方法中,您可以使用AddOrUpdate扩展方法来初始化核心数据。扩展方法将首先检查数据库中是否已存在记录,并更新它或插入新记录。

答案 1 :(得分:1)

我觉得使用Seed方法初始化数据库对于除了非常小而简单的数据集之外的任何事情都是错误的。原因是,正如你所说,它只是经常运行。我们已将数据初始化移出应用程序并转移到安装过程中。我们刚刚构建了一组使用普通实体框架代码来创建所需数据的方法。这样,我们就不必担心性能,可以更轻松地编写验证数据创建代码的测试。

为了在开发期间初始化数据库,我们有一组单元测试,它们将运行与安装程序相同的代码。开发人员只需运行单元测试,就可以正确初始化他们的数据库。