为什么DatabaseInitializer被调用两次?

时间:2019-01-10 22:42:38

标签: c# entity-framework autofac

我继承了一个MVC,该MVC当前使用ApplicationStart方法进行一些设置工作,因此当应用程序通过IIS应用程序池恢复工作时,该设置已经完成。

作为伪代码:

    public class MvcApplication : System.Web.HttpApplication
    {
      protected void Application_Start()
      {
        // Build Api autofac container
        // Build MVC autofac container

        // Resolve serviceOne from the MVC container
        var serviceOne = (IServiceOne)DependencyResolver.Current.GetService(typeof(IServiceOne));

        // Make setup call - includes external http calls and DbContext checking
        serviceOne.syncToExternal();

        // Resolve serviceTwo again from the MVC container
        var serviceTwo = (IServiceTwo)DependencyResolver.Current.GetService(typeof(IServiceTwo));

        // Make setup call - publishes application information to internal message queues so that we know it's running
        serviceTwo.syncToInternalSystems();
      }
    }

在ApplicationStart中,我将完成设置Autofac容器的常规过程;一个用于MVC,另一个用于WebApi。在这里分别注册了MVC或Api控制器,服务类和我的DbContext。

ApplicationStart中的设置工作需要一个服务和一个DbContext(我从MvcContainer解析),因为此时无法访问WebApi。

ServiceOne从外部URL检索数据,并使用它来播种/检查数据库的当前内容。

ServiceTwo读取一些数据并将其发布到公司内部的消息队列中。

Application_Start()完成并且主页已加载后:如果我请求通过MVC进行路由,则DbCobntext的注册数据库Initialzer不会像在Application_Start期间运行时那样被调用,但是如果/api请求的dataInitializer确实被调用。

我怀疑在ApplicationStart方法中运行安装程序会阻止在管理连接的System.Data.Entity.Database中设置标志;因此,当从Api容器解析DbContext时,它认为数据库尚未初始化...?

任何帮助将不胜感激。

我的后退方法是将所有设置转换为种子方法,该方法在调用databaseInitialiser / Migration时运行;但了解为什么原始代码未能按预期执行将很有用。

1 个答案:

答案 0 :(得分:1)

无论何时,ApplicationPool每次启动时都会运行ApplicationStart。您必须使用另一种机制来填充数据库。像Migrations

相关问题