当"第一次"DbContext访问数据库时到底是什么时候?

Sha*_*tin 8 .net c# asp.net entity-framework entity-framework-6

我们试图找出实时框架数据库初始化程序的运行时间.

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

MSDN自相矛盾,称初始化第一次运行时的情况下DbContext使用,但也是第一次一个类型DbContext使用.这是什么?

此外,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行,或者初始化程序是否会在插入之间删除Db,从而留下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();
}
Run Code Online (Sandbox Code Playgroud)

jul*_*gon 6

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

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

如果您对web.config文件进行了更改,或者当应用程序池重新启动或iis进程本身重新启动时,您的应用程序域将再次启动并启动初始化程序.这篇文章应该有助于了解Web应用程序何时发生这种情况.

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