EF不在创建时播种数据库

时间:2014-11-06 20:07:41

标签: asp.net-mvc entity-framework ef-migrations

我正在使用Entity Framework使用Code First和MigrateDatabaseToLatestVersion初始化程序创建和种子数据库。我遇到的问题是,当我在没有数据库的情况下启动ASP.NET MVC应用程序时,EF将创建数据库但不会在第一次运行时播种。如果我在创建数据库后杀死iisexpress并重新启动应用程序,我的种子就可以了。我希望我的种子在数据库创建后运行,但我在第一次运行时甚至没有在种子方法中找到一个断点。我在没有问题的情况下在第二次运行中达到了破发点,但是在杀死数据库之后必须运行应用程序两次才能让我的种子工作。

以下是我的配置类:

public sealed class Configuration : DbMigrationsConfiguration<CompassDb>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
            AutomaticMigrationDataLossAllowed = true;
        }

        protected override void Seed(CompassDb context)
        {
            ModuleSeed.Seed(context);
            PermissionGroupSeed.Seed(context);
            var permissions = PermissionSeed.Seed(context);
            var roles = RoleSeed.Seed(context, permissions);
            UserSeed.Seed(context, roles, permissions);
            OcmPluginSeed.Seed(context);
            SCACSeed.Seed(context);
            ModuleConfigurationSeed.Seed(context);
        }
    }

我在Global.asax文件中调用它。

Database.SetInitializer(new MigrateDatabaseToLatestVersion<CompassDb, Configuration>());
using (var db = new CompassDb())
{
    db.Database.Initialize(true);
}

我确实有一个查询来从页面加载的数据库中获取版本号来创建数据库,但是直接调用初始化程序看起来有点干净。在我通过EF进行数据库调用之前,我遇到了这个问题。我放弃了数据库调用,因为我只使用EF进行自动数据库创建和迁移,然后切换到Dapper进行任何数据库通信。

我发现这篇帖子here,其中人们遇到了与我相同的问题,但似乎并没有得到解决。

更新

我发现问题与我的迁移文件有关。我将所有模型的主键从int更新为long,并且必须删除当前的迁移文件。删除文件后,一切都开始正常工作,将创建数据库并在同一请求上播种。然后我创建了我的初始模式迁移,并回到了第二次启动站点时数据库不会播种的同一问题。我在项目中使用ELMAH并且必须更新第一个迁移文件以执行通过nuget安装ELMAH时包含的sql文件。这可能与问题有关,我会做更多测试,看看是否是原因。

1 个答案:

答案 0 :(得分:1)

我认为我有同样或类似的问题。尝试制作手动初始化程序。它干净,简单,短小。见这个例子:

Public Class CustomDbInit
   Implements IDatabaseInitializer(Of MyContext)

     Public Sub InitializeDatabase(context As MyContext) Implements System.Data.Entity.IDatabaseInitializer(Of MyContext).InitializeDatabase
            If Not context.Database.Exists Then
               context.Database.CreateIfNotExists()
               ' Some other processes, such as WebMatrix initialization if you're using SimpleMembership like I do
            End If
     End Sub 

End Class

然后在Global.asax Application_Start 方法上,将其初始化为:

Dim context As New MyContext()
If Not context.Database.Exists Then
   Database.SetInitializer(New CustomDbInit())
   context.Database.Initialize(False)
End If