C# 应用程序启动时的种子数据库-ASP MVC 3和EF
由于某些原因,当应用程序启动时,我无法让我的应用程序在数据库中植入一些测试数据 执行顺序:C# 应用程序启动时的种子数据库-ASP MVC 3和EF,c#,asp.net-mvc-3,entity-framework-5,C#,Asp.net Mvc 3,Entity Framework 5,由于某些原因,当应用程序启动时,我无法让我的应用程序在数据库中植入一些测试数据 执行顺序: 1) Application_Start() in Global.asax - Database.SetInitializer<LocatorContext>(new DropCreateDatabaseAlways<LocatorContext>()); - new LocatorContext.DropCreateIfChang
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
1)Global.asax中的应用程序_Start()
-SetInitializer(新的DropCreateDatabaseAlways());
-新的LocatorContext.DropCreateIfChangeInitializer()
.InitializeDatabase(新定位器上下文());
2) 我的DBContext类中的onModelCreating()
3) 页面被呈现,并且没有数据被插入到数据库中
任何关于我为什么或如何修复它的想法都将不胜感激
My Global.asax.cs文件
//Global.asax.cs
protected void Application_Start()
{
Database.SetInitializer<LocatorContext>(new DropCreateDatabaseAlways<LocatorContext>());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
//Global.asax.cs
受保护的无效应用程序\u Start()
{
SetInitializer(新的DropCreateDatabaseAlways());
RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
注册地址(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 = "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
}
}
}
//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
{
公共类定位器上下文:DbContext
{
公共数据库集前景{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Conventions.Remove();
}
公共空种子(定位器上下文)
{
var prospect=新列表
{
新前景
{
FirstName=“约翰”,
LastName=“史密斯”,
Address1=“1313模仿鸟巷”,
电子邮件=”jsmith@example.com"
}
};
ForEach(r=>context.Prospects.Add(r));
SaveChanges();
}
公共类DropCreateIfChangeInitializer:DropCreateDatabaseIfModelChanges
{
受保护的覆盖无效种子(LocatorContext上下文)
{
上下文。种子(上下文);
种子(上下文);
}
}
公共类CreateInitializer:DropCreateDatabaseAlways
{
受保护的覆盖无效种子(LocatorContext上下文)
{
上下文。种子(上下文);
种子(上下文);
}
}
静态定位器上下文()
{
#如果调试
Database.SetInitializer(新的DropCreateIfChangeInitializer());
#否则
Database.SetInitializer(新的CreateInitializer());
#恩迪夫
}
}
}
首先,您所有的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);
}
@Yoda这是基于工作代码的,也是基于OPs post的,如果你只是复制/粘贴这段代码,你就没有CreateInitializer类,它显然不会工作。您可能会遇到的另一个问题是,如果您使用EF 6,并且使用带有初始值设定项的迁移。这将导致错误。