ASP.NET MVC Initializer 在 Update-Database 期间不为数据库播种
ASP.NET MVC Initializer doesn't seed Database during Update-Database
标记的重复问题使用了自定义上下文,我使用的是默认上下文 ApplicationDbContext
。
我很困惑为什么每次 运行 更新数据库时都没有播种数据。我阅读了其他带有答案的问题,但不幸的是他们使用的是自定义上下文,我使用的是默认 ApplicationDbContext
。他们似乎有相同的答案,但他们对我不起作用。
我完成了以下工作;
我有一个自定义初始化程序:
public class PostInitializer : DropCreateDatabaseAlways<ApplicationDbContext>
{
protected override void Seed(ApplicationDbContext db)
{
var posts = new List<Post>
{
new Post()
{
Content = "TestA"
},
new Post()
{
Content = "TestB"
}
};
posts.ForEach(p => db.Posts.Add(p));
db.SaveChanges();
}
}
在我的全球 Asax 中:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
// call PostInitializer here
Database.SetInitializer(new PostInitializer());
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
我的模特:
public class Post
{
[Key]
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public DateTime? DateTimeCreated { get; set; }
}
我已经尝试删除数据库,然后 运行更新数据库,但是数据仍然没有播种。
好吧,我的错。 运行 应用程序解决了这个问题。我认为播种会在更新数据库期间发生。这对我有用;
- 运行 应用
- 使用初始化程序中涉及的模型访问控制器,至少访问对我有用的索引页面(localhost/posts)
- 在 Access 期间,数据库将被删除和创建,然后使用初始化程序中指定的任何内容作为种子
- 关闭 Visual Studio 上连接到目标数据库的所有 SQL 选项卡,因为它可能会在删除数据库期间引发错误
写下你的PostInitializer
如下:
public static class PostInitializer
{
public static void Seed()
{
using (ApplicationDbContext dbContext = new ApplicationDbContext())
{
if (dbContext.Database.Exists())
{
if(!dbContext.Posts.Any())
{
var posts = new List<Post>
{
new Post()
{
Content = "TestA"
},
new Post()
{
Content = "TestB"
}
};
posts.ForEach(p => dbContext.Posts.Add(p));
dbContext.SaveChanges();
}
}
}
}
}
然后注册如下:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
PostInitializer.Seed(); // <-- Here it is
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
标记的重复问题使用了自定义上下文,我使用的是默认上下文 ApplicationDbContext
。
我很困惑为什么每次 运行 更新数据库时都没有播种数据。我阅读了其他带有答案的问题,但不幸的是他们使用的是自定义上下文,我使用的是默认 ApplicationDbContext
。他们似乎有相同的答案,但他们对我不起作用。
我完成了以下工作;
我有一个自定义初始化程序:
public class PostInitializer : DropCreateDatabaseAlways<ApplicationDbContext>
{
protected override void Seed(ApplicationDbContext db)
{
var posts = new List<Post>
{
new Post()
{
Content = "TestA"
},
new Post()
{
Content = "TestB"
}
};
posts.ForEach(p => db.Posts.Add(p));
db.SaveChanges();
}
}
在我的全球 Asax 中:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
// call PostInitializer here
Database.SetInitializer(new PostInitializer());
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
我的模特:
public class Post
{
[Key]
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public DateTime? DateTimeCreated { get; set; }
}
我已经尝试删除数据库,然后 运行更新数据库,但是数据仍然没有播种。
好吧,我的错。 运行 应用程序解决了这个问题。我认为播种会在更新数据库期间发生。这对我有用;
- 运行 应用
- 使用初始化程序中涉及的模型访问控制器,至少访问对我有用的索引页面(localhost/posts)
- 在 Access 期间,数据库将被删除和创建,然后使用初始化程序中指定的任何内容作为种子
- 关闭 Visual Studio 上连接到目标数据库的所有 SQL 选项卡,因为它可能会在删除数据库期间引发错误
写下你的PostInitializer
如下:
public static class PostInitializer
{
public static void Seed()
{
using (ApplicationDbContext dbContext = new ApplicationDbContext())
{
if (dbContext.Database.Exists())
{
if(!dbContext.Posts.Any())
{
var posts = new List<Post>
{
new Post()
{
Content = "TestA"
},
new Post()
{
Content = "TestB"
}
};
posts.ForEach(p => dbContext.Posts.Add(p));
dbContext.SaveChanges();
}
}
}
}
}
然后注册如下:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
PostInitializer.Seed(); // <-- Here it is
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}