当我调试我的应用程序时,此方法似乎不在DbContext的构造函数上下文中执行。那么当它被调用时呢?
答案 0 :(得分:30)
要明确的是,OnModelCreating与EF是否为您创建数据库无关。
为了与数据库进行交互,Entity Framework必须构建将持久化的实体模型。如果它尚未构建和缓存该模型,则会触发此事件。
在构建模型之后,从中生成一个哈希,然后EF尝试连接到数据库以查看它是否存在,(b)它是否包含版本信息,存储在EdmMetadata表中的先前哈希,以及(c)该哈希是否与先前从模型计算的哈希匹配。
如果散列不匹配,EF将使用已设置的数据库初始化程序(通过调用Database.SetInitializer(new SomeInitializerType()
),该数据库初始化程序可能会也可能不会删除,创建或以其他方式修改数据库。默认初始化程序(在未指定其他程序时使用)对数据库不执行任何操作,一旦运行,Entity Framework将拒绝与数据库交互,如果它不同步。
如果您的数据库不包含带有哈希的EdmMetadata表,则Entity Framework假定您自己管理数据库架构并愉快地尝试使用它,希望您已经把事情弄好了。如果架构在未来的路上与EF的期望不符,那么在调用SaveChanges()等时会出现错误。
在所有这些场景中,无论您是管理自己的数据库架构还是让EF删除并根据需要重新创建它,无论数据库是否与您的模型同步,OnModelCreating事件都会在Entity Framework第一次需要时触发知道它是什么持续存在。
答案 1 :(得分:10)
当EF需要第一次访问数据库时调用此方法(因此在上下文实例化期间不会)。如果数据库不存在,它将使用编译模型中的信息来创建它。每个应用程序只创建一次模型(它在内部缓存),所以即使你处理了上下文,你的模型仍将被重用于下一个实例。
答案 2 :(得分:-2)
在EF4创建数据库时触发OnModelCreating。通常此事件用于配置EF4生成数据库的方式,因此如果您之前执行了应用程序并且模型保持不变,则数据库已经存在且EF4不会尝试生成新的数据库(尽管此行为还取决于一些配置参数)。