ASP MVC 3和EF - 在应用程序启动种子数据库 [英] Seed Database at Application Start - ASP MVC 3 and EF

查看:488
本文介绍了ASP MVC 3和EF - 在应用程序启动种子数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有关某种原因,当应用程序启动时我不能让我的应用程序种子用一些测试数据的数据库。

执行顺序:

  1)的Application_Start()在Global.asax中          -  Database.SetInitializer&所述; LocatorContext>(新DropCreateDatabaseAlways&所述; LocatorContext>());          - 新LocatorContext.DropCreateIfChangeInitializer()
           .InitializeDatabase(新LocatorContext());     2)onModelCreating()在我的DbContext类
     3)呈现页面时,没有数据被插入到数据库

有什么想法,为什么或如何解决这将是更AP preciated。

我的Global.asax.cs文件

  //的Global.asax.cs
保护无效的Application_Start()
{
    Database.SetInitializer&所述; LocatorContext>(新DropCreateDatabaseAlways&所述; LocatorContext>());    AreaRegistration.RegisterAllAreas();
    RegisterGlobalFilters(GlobalFilters.Filters);
    的RegisterRoutes(RouteTable.Routes);
}

我的DbContext类

  // ClubLocatorContext.cs
使用系统;
使用System.Collections.Generic;
使用System.Data.Entity.ModelConfiguration.Conventions;
使用System.Linq的;
使用的System.Web;
使用System.Data.Entity的;
使用System.Data.Entity.Infrastructure;
使用ClubLocator.Models;
使用ClubLocator.Models.ViewModels;命名空间ClubLocator.DAL
{
    公共类LocatorContext:的DbContext
    {      公共DbSet<展望>展望{搞定;组; }      保护覆盖无效OnModelCreating(DbModelBuilder模型构建器)
      {
          base.OnModelCreating(模型构建器);
          modelBuilder.Conventions.Remove< PluralizingTableNameConvention>();
      }      公共无效种子(LocatorContext上下文)
      {
          VAR前景=新的List<展望>
                         {
                              新展望
                              {
                                      名字=约翰,
                                      姓氏=史密斯
                                      地址1 =1313怪怪家庭
                                      电子邮件=jsmith@example.com
                              }
                         };          prospect.ForEach(R => context.Prospects.Add(R));
          context.SaveChanges();
      }      公共类DropCreateIfChangeInitializer:DropCreateDatabaseIfModelChanges< LocatorContext>
      {
          保护覆盖无效的种子(LocatorContext上下文)
          {
              context.Seed(上下文);
              base.Seed(上下文);
          }
      }      公共类CreateInitializer:DropCreateDatabaseAlways< LocatorContext>
      {
          保护覆盖无效的种子(LocatorContext上下文)
          {
              context.Seed(上下文);
              base.Seed(上下文);
          }
      }      静态LocatorContext()
      {
          #如果DEBUG
          Database.SetInitializer< LocatorContext> (新DropCreateIfChangeInitializer());
          #其他
          Database.SetInitializer< LocatorContext> (新CreateInitializer());
          #万一
      }
    }
}


解决方案

首先,所有的EF code看起来不错。

问题是你需要初始化数据库,否则将EF等到你访问它以某种方式进行初始化。

您可以浏览您的网站多达你想不数据库,甚至启动时,如果没有一个页面的访问数据。

如果要强制数据库初始化应用程序启动时,做这样的事情:

 使用(VAR DB =新LocatorContext())
{
    {
        db.Database.Initialize(真);
    }
}

我通常我创建了一个静态类,如:

 公共静态类LocatorInitializationHandler
{
    公共静态无效初始化()
    {
        Database.SetInitializer(新CreateInitializer()); //如果u想用你的初始化
        使用(VAR DB =新LocatorContext())
        {
            {
                db.Database.Initialize(真);
            }
        }
    }
}

我可以再从App_start拨打:

  //的Global.asax.cs
保护无效的Application_Start()
{
    LocatorInitializationHandler.Inizialize();    AreaRegistration.RegisterAllAreas();
    RegisterGlobalFilters(GlobalFilters.Filters);
    的RegisterRoutes(RouteTable.Routes);
}

For some reason I cannot get my application to seed the database with some test data when the application starts up.

Order of execution:

     1) Application_Start() in Global.asax

         - Database.SetInitializer<LocatorContext>(new DropCreateDatabaseAlways<LocatorContext>());

         - new LocatorContext.DropCreateIfChangeInitializer()
           .InitializeDatabase(new LocatorContext());

     2) onModelCreating() in my DBContext class 


     3) Page is rendered and no data is inserted into the database

Any thoughts as to why or how I can fix it would be much appreciated.

My Global.asax.cs File

//Global.asax.cs
protected void Application_Start()
{
    Database.SetInitializer<LocatorContext>(new DropCreateDatabaseAlways<LocatorContext>());

    AreaRegistration.RegisterAllAreas();
    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}

My DBContext Class

//ClubLocatorContext.cs        
using System;
using System.Collections.Generic;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Linq;
using System.Web;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using ClubLocator.Models;
using ClubLocator.Models.ViewModels;

namespace ClubLocator.DAL
{
    public class LocatorContext : DbContext
    {

      public DbSet<Prospect> Prospects { get; set; }

      protected override void OnModelCreating(DbModelBuilder modelBuilder)
      {
          base.OnModelCreating(modelBuilder);
          modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
      }

      public void Seed(LocatorContext context)
      {
          var prospect = new List<Prospect>
                         {
                              new Prospect
                              {
                                      FirstName = "John",
                                      LastName = "Smith",
                                      Address1 = "1313 Mockingbird Lane",
                                      Email = "jsmith@example.com"
                              }
                         };

          prospect.ForEach(r => context.Prospects.Add(r));
          context.SaveChanges();
      }

      public class DropCreateIfChangeInitializer : DropCreateDatabaseIfModelChanges<LocatorContext>
      {
          protected override void Seed(LocatorContext context)
          {
              context.Seed(context);
              base.Seed(context);
          }
      }

      public class CreateInitializer : DropCreateDatabaseAlways<LocatorContext>
      {
          protected override void Seed(LocatorContext context)
          {
              context.Seed(context);
              base.Seed(context);
          }
      }

      static LocatorContext()
      { 
          #if DEBUG
          Database.SetInitializer<LocatorContext> (new DropCreateIfChangeInitializer ());
          #else
          Database.SetInitializer<LocatorContext> (new CreateInitializer ());
          #endif
      }
    }
}

解决方案

First off, all your EF code looks fine.

the problem is you need initialize your database, otherwise EF will wait until you access it in some way to initialize it.

You could navigate your website as much as you want without the database even starting up, if none of the pages access the data.

If you want to force the database to initialize when the application starts, do something like this:

using (var db = new LocatorContext ())
{
    {
        db.Database.Initialize(true);
    }
}

I usually i create a static class like:

public static class LocatorInitializationHandler
{
    public static void Initialize()
    {
        Database.SetInitializer(new CreateInitializer()); //if u want to use your initializer
        using (var db = new LocatorContext())
        {
            {
                db.Database.Initialize(true);
            }
        }
    }
}

Which i can then call from App_start:

//Global.asax.cs
protected void Application_Start()
{
    LocatorInitializationHandler.Inizialize();

    AreaRegistration.RegisterAllAreas();
    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}

这篇关于ASP MVC 3和EF - 在应用程序启动种子数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆