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

时间:2012-03-02 05:01:22

标签: 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时都会运行此种子数据吗?如果是,我是否可以检测数据库是否已经创建,并且仅在初始数据库创建时添加此种子数据?

2 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:4)

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

适用于EF 4.2及以下版本,似乎仍在使用EF 4.3+