【问题标题】: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()(在此上下文中)是“第一次”。

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


【解决方案1】:

每次 AppDomain 启动时,Entity Framework 都会初始化一次数据库。

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

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

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

【讨论】:

    猜你喜欢
    • 2016-10-11
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2014-09-09
    • 2017-12-11
    • 2023-02-25
    • 2021-08-03
    相关资源
    最近更新 更多