gpt4 book ai didi

c# - 应用程序启动时的种子数据库 - ASP MVC 3 和 EF

转载 作者:太空狗 更新时间:2023-10-30 00:32:32 25 4
gpt4 key购买 nike

由于某些原因,我无法让我的应用程序在启动时用一些测试数据为数据库播种。

执行顺序:

     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 = "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
}
}
}

最佳答案

首先,您的所有 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);
}

关于c# - 应用程序启动时的种子数据库 - ASP MVC 3 和 EF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17236716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com