为啥不调用种子方法?

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 方法不调用?

为啥不根据参数类型调用最具体的方法

VB中随即函数为啥每次的得数都是一样的

为啥非 const 方法是私有的时不调用公共 const 方法?

为啥Python调用方法,有的前面加类名,有的不加?