Entity framework 4 使用实体框架迁移的种子设定和分支项目

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

我正在做一个项目,使用EntityFramework代码First4.3,使用迁移。 在本地运行时,my web.config被配置为以实现
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语句。而不是通过上下文播种。我正在研究另一种解决方案,并将发布一次/如果检查出有效。