我正在做 2 个类似的项目 - 但我没有创建它们中的任何一个。
它们都具有相同的本地上下文,如下所示:
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
这些项目是使用洋葱架构制作的,我正在使用Swagger运行REST层。
问题是,在其中一个项目中,当我启动应用程序时调用OnModelCreating
(我所期望),而在另一个项目中,它在用户第一次执行操作时调用。
谁能解释为什么会这样?
我假设某处有一个设置触发了这个调用 - 但我找不到它 - 正如我上面所说,我已经搜索了整个项目,但找不到任何调用此方法的地方。
据我所知,两个项目之间的所有参考都是相同的 - 谁能帮忙?
数据库上下文时调用它。
如果在启动代码中使用数据库初始值设定项,则会发生以下情况:
Database.SetInitializer(new CreateDatabaseIfNotExists<MyDbContext>());
否则,它将在您第一次创建实例时发生:
using (var context = new MyDbContext()) {
...
}
OnModelCreating
方法通常在创建派生上下文的第一个实例或在应用程序中使用数据访问时调用。 这位于应用程序中不同点的原因可能是由于您在生命周期的不同点调用数据访问层。 我认为在这种情况下,一个应用程序在启动时创建LocalContext
的副本,而另一个应用程序在用户访问数据层之前不会创建上下文。
此处的一些详细文档,并在此处查看涉及此主题的另一个 SO 问题。