【发布时间】: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()(在此上下文中)是“第一次”。
标签: c# asp.net .net entity-framework entity-framework-6