EF 4.1 Code First - OnModel创建呼叫时间

rov*_*sen 8 .net entity-framework ef-code-first entity-framework-4.1

当我调试我的应用程序时,此方法似乎不在DbContext的构造函数上下文中执行.那么什么时候被召唤呢?

小智 30

需要说明的是,OnModelCreating与EF是否为您创建数据库无关.

为了与数据库交互,Entity Framework必须构建将持久化的实体的模型.如果它尚未构建和缓存该模型,则会触发此事件.

之后构建模型,从它生成的哈希,和EF然后尝试连接到数据库,看是否(一)存在,(B),它包含的版本信息,存储在EdmMetadata表之前的哈希值,和( c)该散列是否与先前从模型计算的散列匹配.

如果散列不匹配,则EF使用已设置的数据库初始化程序(通过调用Database.SetInitializer(new SomeInitializerType()),该数据库初始化程序可能会也可能不会删除,创建或以其他方式修改数据库.默认初始化程序在未指定其他程序时使用,对数据库不执行任何操作,一旦运行,Entity Framework将拒绝与数据库交互(如果数据库不同步).

如果您的数据库不包含其中包含哈希的EdmMetadata表,则实体框架假定您自己管理数据库模式并愉快地尝试使用它,希望您已经把事情弄好了.如果架构在未来的路上与EF的预期不符,那么在调用SaveChanges()等时会出现错误.

在所有这些情况下,不管你是管理自己的数据库架构或让EF删除并重建它根据需要,数据库是否同步与您的模型与否,OnModelCreating事件触发第一次实体框架需要知道什么它坚持不懈.


Lad*_*nka 10

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