C# 确切的时间是什么时候;“第一次”;DbContext访问数据库?

C# 确切的时间是什么时候;“第一次”;DbContext访问数据库?,c#,asp.net,.net,entity-framework,entity-framework-6,C#,Asp.net,.net,Entity Framework,Entity Framework 6,我们试图弄清楚实体框架数据库初始值设定项何时运行 MSDN说初始化发生在我们“第一次”访问数据库时。“第一次”是什么时候 MSDN自相矛盾,指出初始化在第一次使用DbContext实例时运行,但在第一次使用DbContext类型时也运行。是哪一个 此外,MSDN没有定义“第一次”?这是自出版以来的第一次吗?自应用程序启动以来的第一次?对于给定的请求,对于给定的方法,是第一次吗?如果我们通过更改web.config重新启动应用程序呢 这里有一些来自MSDN的引用,说数据库初始化器正在运行 首次使用

我们试图弄清楚实体框架数据库初始值设定项何时运行

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

MSDN自相矛盾,指出初始化在第一次使用
DbContext
实例时运行,但在第一次使用
DbContext
类型时也运行。是哪一个

此外,MSDN没有定义“第一次”?这是自出版以来的第一次吗?自应用程序启动以来的第一次?对于给定的请求,对于给定的方法,是第一次吗?如果我们通过更改web.config重新启动应用程序呢

这里有一些来自MSDN的引用,说数据库初始化器正在运行

首次使用DBContext派生类的实例时

首次使用给定的DbContext类型访问数据库时

例如,我们有一个控制器操作,在该操作中实例化一个
DbContext
并运行一个插入操作。如果我们调用此操作两次(或10000次),
DbInitializer
会运行那么多次吗?如果我们使用的是
DropDatabaseCreateAlways
初始值设定项,并且我们调用了两次此操作,那么Db会有两行
事件
行,还是初始值设定项会在插入之间删除Db,从而留下一行
事件

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();
}

实体框架在每次AppDomain启动时初始化数据库一次

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

如果您对web.config文件进行了更改,或者当应用程序池回收或iis进程本身重新启动时,您的应用程序域将再次启动,初始化程序将启动


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

非常确定是在您第一次读取/更新/删除/插入时。如果您需要确定,则无法通过观察来确定。您需要查找文档或源代码。@ShaunLuttin,我的意思是在实例化数据库后第一次使用它访问数据库。如果您创建一个新实例,它将在您第一次使用第二个实例时再次对其进行初始化。到目前为止,我使用了
SQL Profiler
,发现当您执行
db.Savechages
或从某个表中选择,并使用
.ToList()
时,它实际上对db进行了SQL查询。
.ToList()
(在此上下文中)这是“第一次”。