DbContext 究竟是啥时候“第一次”访问数据库?
Posted
技术标签:
【中文标题】DbContext 究竟是啥时候“第一次”访问数据库?【英文标题】:When exactly is the "first time" a DbContext accesses the database?DbContext 究竟是什么时候“第一次”访问数据库? 【发布时间】:2014-12-18 02:26:15 【问题描述】:我们正在尝试确定实体框架数据库初始化程序何时运行。
MSDN 说初始化发生在我们“第一次”访问数据库时。 “第一次”是什么时候?
MSDN 自相矛盾,指出初始化在第一次使用 DbContext
的 instance 时运行,但也是在第一次使用 DbContext
的 type 时用过的。是哪个?
此外,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 次),DbInitializer
会运行那么多次吗?如果我们使用DropDatabaseCreateAlways
初始化器,并且我们调用此操作两次,Db 将有两个Event
行,还是初始化器会在插入之间删除数据库,从而留下一个Event
行?
public HttpResponseMessage PostEvent(EventDTO eventDTO)
var ev = new Event()
Id = eventDTO.Id,
Name = eventDTO.Name
;
using (AttendanceContext db = new AttendanceContext())
db.Events.Add(ev);
db.SaveChanges();
return Ok();
【问题讨论】:
很确定是在您第一次读取/更新/删除/插入时。 如果你需要肯定知道,通过观察是不可能找到的。您需要查找文档或源代码。 @ShaunLuttin,我的意思是它在实例化后第一次用于访问数据库。如果您创建一个新实例,它将在您第一次使用第二个实例时再次初始化它。 到目前为止,我使用了SQL Profiler
,发现当你做db.Savechages
或从某个表中选择,并使用.ToList()
时,它实际上是对数据库进行SQL查询。
.ToList()
(在此上下文中)是“第一次”。
【参考方案1】:
每次 AppDomain 启动时,Entity Framework 都会初始化一次数据库。
当DbContext
类首次由您的代码实例化并访问其中一个属性时,它使用处理初始化逻辑的InternalContext
实例,并使用静态类确保所述初始化只运行一次字段。
如果您对 web.config 文件进行更改,或者当应用程序池回收或重新启动 iis 进程本身时,您的应用程序域将再次启动并且初始化程序将触发。 This post should help in knowing when this happens in web applications.
多次重用同一个上下文实例,甚至每次请求都创建一个新上下文,不会每次都触发初始化。
【讨论】:
以上是关于DbContext 究竟是啥时候“第一次”访问数据库?的主要内容,如果未能解决你的问题,请参考以下文章