为啥不调用种子方法?
Posted
技术标签:
【中文标题】为啥不调用种子方法?【英文标题】:Why is the seed method not being called?为什么不调用种子方法? 【发布时间】:2015-07-30 20:27:09 【问题描述】:我正在编写一个 MVC 5 互联网应用程序,并且需要一些帮助来执行种子方法以使用一些实体填充数据库。
这是我的DbContext
代码:
public class CanFindLocationDatabaseContext : DbContext
public class SystemInitializer : CreateDatabaseIfNotExists<CanFindLocationDatabaseContext>
protected override void Seed(CanFindLocationDatabaseContext context)
在我的Application_Start
方法中,我有以下代码:
System.Data.Entity.Database.SetInitializer<CanFindLocationDatabaseContext>(new CanFindLocation.Context.CanFindLocationDatabaseContext.SystemInitializer());
当我访问CanFindLocationDatabaseContext
类中的任何DbSet
对象时,不会执行种子方法。在我测试种子代码之前没有数据库。
正在创建数据库并正在创建表,但没有调用种子方法,并且任何表中都没有数据。
我在同一个项目中还有以下标识 2.1 的代码:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
public ApplicationDbContext()
: base("CanFindLocationDatabaseContext", throwIfV1Schema: false)
为此 DbContext 类调用种子方法,但不为 CanFindLocationDatabaseContext
调用。
为什么会这样,我该如何编写代码以执行种子方法?
提前致谢。
【问题讨论】:
我假设您确定数据库不存在? 数据库不存在。 确保在启动调试之前重置 IIS 或停止 ASP Developpement 服务器,否则视觉不会停止并重新启动应用程序并阻止 Application_Start 执行。 【参考方案1】:数据库是延迟加载的,只有在访问时才会创建,所以如果你需要它来做种子,你需要访问 Seed() 中的上下文,或者你可以添加:
System.Data.Entity.Database.SetInitializer<CanFindLocationDatabaseContext>(new CanFindLocation.Context.CanFindLocationDatabaseContext.SystemInitializer());
var db = new CanFindLocationDatabaseContext()
db.Database.Initialize(true); // force database creation
https://msdn.microsoft.com/en-us/library/system.data.entity.database.initialize(v=vs.113).aspx
【讨论】:
【参考方案2】:一直以来,我都认为这是我的错而没有调用种子方法。我最初将launchSettings.json
中的"launchBrowser"
属性设置为false
,所以我将其更改为true
并解决了...数据库已播种!
【讨论】:
以上是关于为啥不调用种子方法?的主要内容,如果未能解决你的问题,请参考以下文章
为啥不调用方法 updateSearchResultsForSearchController?
为啥 UITableViewCells cellForRowAt 方法不调用?