2

我正在使用实体框架代码第一次使用迁移工作4.3。 在本地运行时,我的web.config被配置为以数据库初始化为目标,该初始化实现了CreateDatabaseIfNotExists<DataContext>,它为我的开发数据库提供了测试数据,同时也在第一次运行时填充了各种“静态”可查找数据。使用实体框架迁移进行种子和分支项目

一旦开发数据库已经被创建,对数据库的任何后续修改都会添加到项目的迁移并使用'updata-database'PS命令更新数据库。

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

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

总之我正在寻找关于创建使用迁移首次数据库时,种子初始测试数据&所需的应用程序数据

  1. 最佳方式的信息。
  2. 分支包含代码迁移项目并首次创建数据库时克服问题的最佳方法。

感谢您的阅读。

回答

1

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

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

+0

我知道所提到的种子的方法。我对使用它的担心是它每次运行迁移时都会执行。 我的一些初步的核心数据会/可以通过应用程序时,它的运行变化,我不希望如果添加了新的迁移它复位。 如果你在配置类包装的种子方法,因此只有执行的“InitialCreate”迁移我想这会工作,但我还没有找到什么好办法做到这一点的一个好方法。 – Drauka 2012-04-19 10:22:14

+0

这是你的责任,以确保调用'Seed'方法是可重复的 - 'AddOrUpdate'可以用它帮助。如果您无法确保将自定义种子SQL语句直接添加到迁移中的“Up”方法。 – 2012-04-19 11:02:26

+1

我明白你在说什么,但使用实体框架的诸多原因之一是为了避免必须编写相对复杂的SQL插入语句。而不是通过上下文播种。我正在寻找一种替代解决方案,并且会发布一次/如果检查正在工作。 – Drauka 2012-04-19 11:16:01

1

我觉得初始化你的数据库使用Seed方法是一个错误,除了非常小的和简单的数据集。原因是,正如你所说,它只是运行得太频繁。我们已将数据初始化从应用程序中移出并转入安装过程。我们刚刚构建了一组使用常规实体框架代码创建所需数据的方法。这样,我们不必担心性能,并且可以更轻松地编写验证数据创建代码的测试。

在开发期间初始化数据库,我们有一整套的单元测试将运行安装程序将执行相同的代码。开发人员只需运行单元测试,他们的数据库将被正确初始化。