由于某种原因,我无法让我的应用程序在应用程序启动时使用一些测试数据为数据库播种。
执行顺序:
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
任何关于为什么或如何解决它的想法将不胜感激。
我的 Global.asax.cs 文件
//Global.asax.cs
protected void Application_Start()
{
Database.SetInitializer<LocatorContext>(new DropCreateDatabaseAlways<LocatorContext>());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
我的 DBContext 类
//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 = "[email protected]"
}
};
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
}
}
}
首先,您的所有 EF 代码看起来都很好。
问题是,您已经初始化了数据库。否则 EF 将等待,直到您以某种方式访问它才能初始化它。
如果没有任何页面访问数据,您甚至可以在数据库不启动的情况下随意浏览您的网站。
如果您想在应用程序启动时强制数据库初始化,请执行以下操作:
using (var db = new LocatorContext())
{
db.Database.Initialize(true);
}
我通常创建一个静态类,例如:
public static class LocatorInitializationHandler
{
public static void Initialize()
{
// if you want to use your initializer
Database.SetInitializer(new CreateInitializer());
using (var db = new LocatorContext())
{
db.Database.Initialize(true);
}
}
}
然后我可以从 App_start 调用:
//Global.asax.cs
protected void Application_Start()
{
LocatorInitializationHandler.Initialize();
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)