恰好是"第一次"一个DbContext访问数据库?

时间:2014-10-22 15:10:15

标签: c# asp.net .net entity-framework entity-framework-6

我们正在尝试确定何时运行实体框架数据库初始化程序。

MSDN表示初始化发生在"第一次"我们访问数据库。什么时候"第一次"?

MSDN自相矛盾,声称初次使用DbContext实例时首次运行,但也是第一次{{>> 的{{>> 1}}被使用。这是什么?

此外,MSDN没有定义"第一次"?这是自发布以来的第一次吗?自Application_Start以来的第一次?给定方法的第一次给定方法?如果我们通过更改web.config重新启动应用程序怎么办?

以下是MSDN的一些引用,说数据库初始化程序运行...

  

第一次使用DBContext派生类的实例时

http://msdn.microsoft.com/en-us/library/gg696323%28v=vs.113%29.aspx

  

当第一次使用给定的DbContext类型访问数据库时

http://msdn.microsoft.com/en-us/library/gg679461%28v=vs.113%29.aspx

例如,我们有一个控制器操作,我们在其中实例化DbContext并运行插入操作。如果我们将此操作调用两次(或10,000次),那么DbContext会多次运行吗?如果我们正在使用DbInitializer初始值设定项,并且我们将此操作调用两次,那么Db是否会有两个DropDatabaseCreateAlways行,或者初始值设定项会在插入之间删除Db,从而留下一个{{1}行?

Event

1 个答案:

答案 0 :(得分:6)

每个AppDomain启动时,实体框架会初始化数据库一次。

当代码首次实例化DbContext类,并且访问其中一个属性时,它使用处理初始化逻辑的InternalContext实例,并确保所述初始化使用静态类字段只运行一次。

如果您对web.config文件进行了更改,或者当应用程序池回收或iis进程本身重新启动时,您的应用程序域将再次启动并启动初始化程序。 This post should help in knowing when this happens in web applications.

多次重复使用相同的上下文实例,甚至在每个请求上创建新的上下文,每次都不会触发初始化。