Identity.EntityFramework OnModelCreating如何调用

时间:2017-02-01 14:00:16

标签: c# entity-framework asp.net-identity

我正在开展两个类似的项目 - 但我没有创建其中任何一个。

它们都具有相同的本地上下文,如下所示:

using Microsoft.AspNet.Identity.EntityFramework;

    public class LocalContext :
        IdentityDbContext
            <ApplicationUser, ApplicationRole, int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
    {
     //.....

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            AddConfigurations(modelBuilder);
        }
    }

在整个项目中搜索对OnModelCreating的引用,返回上面提到的2个实例,以及命名空间Microsoft.AspNet.Identity.EntityFramework中对此方法的引用

这些项目是使用Onion架构制作的,我使用Swagger运行REST层。

问题在于,在其中一个项目中,当我启动应用程序(我期望的)时会调用OnModelCreating,而在另一个项目中,它会在用户第一次执行操作时调用。

任何人都可以解释为什么会这样吗?

我假设某个地方有一个触发此调用的设置 - 但我找不到它 - 正如我上面所说的那样,我搜索了整个项目,但无法找到调用此方法的任何地方。

据我所知,两个项目之间的所有参考文献都是相同的 - 任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:7)

在初始化数据库上下文时调用它。

如果您在启动代码中使用数据库初始化程序,那么它将会发生:

Database.SetInitializer(new CreateDatabaseIfNotExists<MyDbContext>());

否则它会在您第一次创建它的实例时发生:

using (var context = new MyDbContext()) {
    ...
}

答案 1 :(得分:2)

当您在应用程序中创建派生上下文的第一个实例或使用数据访问时,通常会调用OnModelCreating方法。这是因为您在应用程序中的不同点可能是因为您在生命周期的不同点调用数据访问层。我认为在这种情况下,一个应用程序在启动时创建LocalContext的副本,而另一个应用程序在用户访问数据层之前不会创建上下文。

请查看here以获取详细文档,并here查看有关此主题的其他SO问题。