5

我知道如何使用 EF 4.3 中的迁移 API 来处理种子数据。我整晚都在玩那个。但是,我的最终目标是让我的项目达到用户可以从源代码控制中拉出它并按 F5 的程度,然后它们就可以开始了,数据库,种子数据等等。

目前,代码优先在新版本上构建数据库方面做得很好,但是直到我在包管理器控制台中执行 Update-Database 后才会插入种子数据。那时它运行种子方法并插入我的种子数据。

  1. 在 OnModelCreating 方法中这样做可以吗?
  2. 我还能在这里利用 AddOrUpdate 扩展方法吗?
  3. 每次按 F5 时都会运行此种子数据吗?如果是这样,我可以检测数据库是否已经创建,并且只在初始数据库创建时添加这个种子数据?
4

2 回答 2

9
  1. 每次必须构建模型定义时执行否OnModelCreating= 每次启动应用程序并第一次使用数据访问时。在您的开发环境中可能很好,但在生产环境中并不好。此外,在构造上下文时不能使用上下文,因此在此方法中播种数据的唯一方法是直接使用 SQL。
  2. AddOrUpdate 主要用于迁移。它有隐藏的成本(反射和查询数据库)所以小心使用它。
  3. 您可以通过手动执行 SQL 查询来检测它(您不能Database.Exists在内部使用OnModelCreating- 再次因为在构造上下文时此方法不可用)但它不属于OnModelCreating=> 单一职责模式。

有更好的方法可以做到这一点。

  • MigrateDatabaseToLatestVersion如果数据库不存在或更新现有数据库,EF 4.3 中的数据库初始化程序将运行您的迁移集
  • 您可以DbMigrator在应用程序的引导程序中使用类,并将您的数据库迁移到最后一个版本,从而更好地控制整个过程
  • 我没有检查是否有可能,但您应该能够修改 MSBuild 或向您的项目添加预构建操作,这将以某种方式使用 power shell 命令或使用DbMigrator类执行自定义控制台应用程序。
于 2012-03-02T08:24:57.393 回答
4

从 CreateDatabaseIfNotExists 类继承时,在覆盖的 Seed() 方法中播种数据有什么问题?

它适用于 EF 4.2 及更低版本,并且似乎仍在使用 EF 4.3+

于 2012-03-21T19:08:54.253 回答