Entity framework EF6在数据访问之前,强制先创建代码的内存模型

Entity framework EF6在数据访问之前,强制先创建代码的内存模型,entity-framework,Entity Framework,据我所知,对于code first,内存中的模型是在第一次数据访问时创建的,这导致了第一次数据访问的延迟(在我的例子中是几秒钟) 有没有办法在应用程序启动时强制创建内存中的模型,以避免第一次数据访问期间的延迟 谢谢。您可以使用EF数据库初始值设定项并调用IDatabaseInitializer的InitializeDatabase方法来初始化数据库 您可以使用任何内置数据库初始值设定项来执行此操作 在全局.asax的应用程序启动方法中使用DropCreateDatabaseIfModelChan

据我所知,对于code first,内存中的模型是在第一次数据访问时创建的,这导致了第一次数据访问的延迟(在我的例子中是几秒钟)

有没有办法在应用程序启动时强制创建内存中的模型,以避免第一次数据访问期间的延迟


谢谢。

您可以使用EF数据库初始值设定项并调用
IDatabaseInitializer
InitializeDatabase
方法来初始化数据库

您可以使用任何内置数据库初始值设定项来执行此操作

全局.asax的
应用程序启动
方法中使用
DropCreateDatabaseIfModelChanges
初始值设定项的示例:

    protected void Application_Start()
    {
        Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DataContext>());
        using (var context = new DataContext())
        {
            context.Database.Initialize(false);
        }
    }
受保护的无效应用程序\u Start()
{
SetInitializer(新的DropCreateDatabaseIfModelChanges());
使用(var context=new DataContext())
{
context.Database.Initialize(false);
}
}
DropCreateDatabaseIfModelChanges
初始值设定项将检查应用程序每次启动时是否有任何模型更改,如果有,它将根据最新模型删除并重新创建数据库

您可以使用以下初始值设定项之一,而不是
DropCreateDatabaseIfModelChanges

CreateDatabaseIfNotExists

DropCreateDatabaseAlways


MigrateDatabaseToLatestVersion(如果您使用的是DbMigrations)

是。在用户需要数据之前,尝试简单地访问数据。谢谢,这是我在服务启动之前所做的,但这涉及到将数据层带到不应该的位置。我以为会有更干净的解决办法。类似于在DBConfiguration类中设置DatabaseInitializer,而不是在main()中;看起来马克的回答中有你。现在我看到了,我记得我以前做过!谢谢,但是不,我不是在问初始化者!他们创建了一个数据库。但在代码中,首先当您启动应用程序,然后尝试访问数据时,在此过程中,EF将尝试创建一个内存模型,它将使用该模型将数据库集映射到DB(惰性内存模型创建)。这会导致明显的延迟(但仅在第一次数据访问时)。我希望有一种方法可以让EF在第一次数据访问之前创建这个内存模型,可以这么说。@alexW数据库创建不是初始化器的唯一工作。初始化数据库时,还会检查数据库中的_MigrationHistory表__MigrationHistory是EF在数据库中创建的一个表,用于跟踪所做的更改,以确定数据库处于何种状态以及要应用哪些迁移。你绝对肯定问题不是由其他原因引起的吗?当你第一次启动你的应用程序时,可能发生了IIS循环?@alexW我还注意到你提到你不想将数据层带到不应该的地方(我完全同意这一点)。我通常在服务层中创建一个名为.InitializeDatabase()的类和方法,然后从应用程序开始调用该方法。这样,我就不必在我的web应用程序中引用我的数据库层了。在真正访问数据之前,我对数据进行了一次假调用,然后我可以很好地访问它们。否则第一次打电话要花很长时间。我从一个pluralsite课程中记得这一点,为什么是这样:CodeFirst没有edmx,所以它必须在内存中惰性地创建一个。只是打一个假数据电话也是一种同样的黑客行为。它通过网络在本地运行