C# 实体框架代码如何以及何时第一次生成数据库?

C# 实体框架代码如何以及何时第一次生成数据库?,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我遇到了一个相关的问题: 但这似乎并不能回答代码优先应用程序何时实际检查数据库的存在性/正确性并在必要时对其进行修改的问题。它是在运行时还是构建时?假设是在运行时,是在启动时,还是在您创建DbContext时,或在最后一个可能的时刻,例如,当您尝试写入/读取DB表时,它会逐个检查它们是否存在?在您第一次访问实体时,它会在rutime中显示,即 using (var db = new MyDBContext()) { var items = db.MyObj.Count() // <-

我遇到了一个相关的问题:


但这似乎并不能回答代码优先应用程序何时实际检查数据库的存在性/正确性并在必要时对其进行修改的问题。它是在运行时还是构建时?假设是在运行时,是在启动时,还是在您创建DbContext时,或在最后一个可能的时刻,例如,当您尝试写入/读取DB表时,它会逐个检查它们是否存在?

在您第一次访问实体时,它会在rutime中显示,即

using (var db = new MyDBContext())
{
   var items = db.MyObj.Count() // <- Here it is created!
}
使用(var db=new MyDBContext())
{

var items=db.MyObj.Count()EDMX的版本。在代码优先中,列模型由添加迁移生成,并存储在迁移分部类的第二部分中,以及数据库创建为二进制流varbinary(max)时存储在数据库中

当调用数据库初始值设定项(database.SetInitializer)时,EF将动态地从类(运行时)生成当前实体数据模型(EDMX)。生成的模型将被序列化、压缩(base64),最后将其与迁移历史表的存储模型进行比较


比较发生在创建DbContext之前,如果两个模型(二进制流)不相同,则会出现兼容性异常

初始化实际上高度依赖于初始化策略,而不仅仅是“口味”!在预定义策略中,通过查看uu MigrationHistory表(如果不是DropCreateDatabaseAlways),根据模型检查数据库在上下文初始化时,但不是在用户定义的初始值设定项中。初始值设定项在模型构建之后立即运行,在这一过程中,必须注意使用正确的模式创建数据库。因此,这不像是什么奇怪的噱头,而是初始值设定项的真正含义。你是对的,但是“它在这里创建了”这就是它被实际检查的地方,也就是说,当所有的“魔法”完成。当然,关于如何/何时执行的许多细节取决于您的实现。当然,因为初始值设定项是在那里运行的。但是,由于您提到了初始化策略,您应该提到这些初始值设定项的实现是这种“魔力”的来源。