.net EF 4.1代码优先-创建模型调用时间

.net EF 4.1代码优先-创建模型调用时间,.net,entity-framework,ef-code-first,entity-framework-4.1,.net,Entity Framework,Ef Code First,Entity Framework 4.1,当我调试我的应用程序时,这个方法似乎并没有在DbContext的构造函数上下文中执行。因此,当调用它时?当EF4创建数据库时,会触发OnModelCreating。通常,此事件用于配置EF4生成数据库的方式,因此,如果以前执行过应用程序,并且模型保持不变,则数据库已经存在,EF4不会尝试生成新的数据库(尽管此行为还取决于某些配置参数) 当EF第一次需要访问数据库时调用此方法(因此它不是在上下文实例化期间)。如果数据库不存在,它将使用编译模型中的信息来创建它。每个应用程序只创建一次模型(它在内部缓

当我调试我的应用程序时,这个方法似乎并没有在DbContext的构造函数上下文中执行。因此,当调用它时?

当EF4创建数据库时,会触发OnModelCreating。通常,此事件用于配置EF4生成数据库的方式,因此,如果以前执行过应用程序,并且模型保持不变,则数据库已经存在,EF4不会尝试生成新的数据库(尽管此行为还取决于某些配置参数)

当EF第一次需要访问数据库时调用此方法(因此它不是在上下文实例化期间)。如果数据库不存在,它将使用编译模型中的信息来创建它。每个应用程序只创建一次模型(它在内部缓存),因此即使您处理了上下文,您的模型仍将在下一个实例中重用。

要清楚,OnModelCreating与EF是否为您创建数据库无关

为了和数据库交互,实体框架必须建立一个将被持久化的实体模型。如果尚未构建和缓存该模型,则会触发此事件

构建模型后,将从中生成散列,然后EF尝试连接到数据库,以查看(a)它是否存在,(b)它是否包含版本信息、存储在元数据表中的先前散列,以及(c)该散列是否与先前从模型计算的散列相匹配

如果哈希不匹配,EF将使用已设置的数据库初始值设定项(通过调用
database.SetInitializer(new SomeInitializerType()
),它可能会也可能不会删除、创建或以其他方式修改您的数据库。在您未指定其他初始值设定项时使用的默认初始值设定项不会对您的数据库执行任何操作,并且一旦数据库运行,Entity Framework将在数据库不同步时拒绝与数据库交互

如果您的数据库不包含包含散列的EdmMetadata表,Entity Framework会假定您正在独自管理数据库架构,并乐于尝试使用它,希望您能正确使用它。如果以后该架构不符合EF的期望,则调用SaveChanges()时会出错诸如此类


在所有这些场景中,无论您是在管理自己的数据库架构,还是让EF根据需要删除并重新创建它,无论数据库是否与您的模型同步,OnModelCreating事件都会在Entity Framework需要知道其持久性的第一时间触发。

即使在我的cas中也不应该始终执行此配置吗e(模型更改时不生成db)?否则EF如何知道如何映射列?如果未生成db,则不会触发OnModelCreating。在codefirst方式中,EF对所有未指定的映射使用约定。创建数据库后,EF会在每次执行应用程序时记住映射。如果在开发应用程序时对模型进行更改,则在上,也许您应该使用“AlwaysCreateDatabase”选项,每次运行应用程序时都会重新生成数据库,并且OnModelCreating将始终触发。