DbContext 究竟是啥时候“第一次”访问数据库?

Posted

技术标签:

【中文标题】DbContext 究竟是啥时候“第一次”访问数据库?【英文标题】:When exactly is the "first time" a DbContext accesses the database?DbContext 究竟是什么时候“第一次”访问数据库? 【发布时间】:2014-12-18 02:26:15 【问题描述】:

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

MSDN 说初始化发生在我们“第一次”访问数据库时。 “第一次”是什么时候?

MSDN 自相矛盾,指出初始化在第一次使用 DbContextinstance 时运行,但也是在第一次使用 DbContexttype 时用过的。是哪个?

此外,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 究竟是啥时候“第一次”访问数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如日中天的hadoop究竟是啥??

低代码究竟是啥?

请问SAP中的统驭科目究竟是啥意思?

MIB究竟是啥意思?

学了那么多NoSQL数据库!NoSQL究竟是啥?

帧缓冲区在 Vulkan 中究竟是啥意思