将种子数据放在EF代码优先的OnModelCreating方法中是否可以接受?

Che*_*hev 5 c# entity-framework ef-code-first ef-migrations entity-framework-4.3

我知道如何使用EF 4.3中的迁移API执行种子数据.我整晚都在玩那个.但是,我的最终目标是让我的项目达到用户可以从源代码控制中拉出它并按F5并且它们很好用,数据库,种子数据等等.

目前代码优先在新构建上构建数据库非常出色,但在我在包管理器控制台中执行Update-Database之前,不会插入种子数据.此时它运行种子方法并插入我的种子数据.

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

Lad*_*nka 9

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

有更好的方法来做到这一点.

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