C# 代码优先的MVC不';开始

C# 代码优先的MVC不';开始,c#,asp.net-mvc,entity-framework,asp.net-mvc-4,C#,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,我首先使用代码为我的MVC应用程序开发数据库。以下是连接字符串: 它使用SQL身份验证,因为由于我尚未确定的原因,Windows Auth不允许我在服务器上执行任何操作 下面是应用程序启动() 此类调用db.Database.Initialize(true)并运行我编写的一个方法,将一些默认信息添加到数据库中 public static class OrtundDB { private static OrtundDBContext db = new OrtundDBContext();

我首先使用代码为我的MVC应用程序开发数据库。以下是连接字符串:

它使用SQL身份验证,因为由于我尚未确定的原因,Windows Auth不允许我在服务器上执行任何操作

下面是应用程序启动()

此类调用
db.Database.Initialize(true)
并运行我编写的一个方法,将一些默认信息添加到数据库中

public static class OrtundDB
{
    private static OrtundDBContext db = new OrtundDBContext();

    public static void InitializeDB()
    {
        db.Database.Initialize(true);
        db.InitializeDB();
    }
}
这是我编写的正在使用的DBContext类。这存在于MVC项目中引用的另一个项目中:

internal class OrtundDBContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        // modelBuilder.Configuration.Adds()
    }

    public OrtundDBContext()
        : base("OrtundWebConnectionString")
    {
        Database.SetInitializer<OrtundDBContext>(new DropCreateDatabaseAlways<OrtundDBContext>());
    }

    public void InitializeDB()
    {
        // inserts the default data - an admin user account and information for user roles
    }

    // DbSet calls here
}
内部类OrtundDBContext:DbContext
{
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
//modelBuilder.Configuration.Adds()
}
公共OrtundDBContext()
:base(“OrtundWebConnectionString”)
{
SetInitializer(新的DropCreateDatabaseAlways());
}
public void InitializeDB()
{
//插入默认数据-管理员用户帐户和用户角色信息
}
//DbSet在这里呼叫
}
我以前用同样的方法构建过一个MVC应用程序,而且这个方法很有效。但是,它甚至不会每次都执行
应用程序\u Start()

在执行Application_Start的奇怪情况下,它一直执行
db.Database.Initialize(true)在这一点上,它似乎永远不会结束。我没有出错,但动作似乎没有完成

说到MVC,我是个新手,所以我不知道问题是什么,也不知道如何解决

我们将非常感谢您为解决此问题提供的任何帮助(以及可能导致此问题的原因的解释)


提前谢谢

问题可能在于您对
应用程序启动的期望

对于正在加载到IIS上的应用程序池中的应用程序,将调用一次应用程序启动。 只有在回收应用程序池或重新启动IIS时,才会再次调用它

阅读需要10-15分钟 这将有助于正在发生的事情

由于对线程和请求的错误期望,我有一个讨厌的bug

在调试中考虑和测试的替代品,看看它们是否适合您:

Global.asax中的INIT

 public override void Init() {
        base.Init();
        // handlers managed by ASP.Net during Forms authentication
        BeginRequest += new EventHandler(BeginRequestHandler);
      //  PostAuthorizeRequest += new EventHandler(PostAuthHandler);
        EndRequest += new EventHandler(EndRequestHandler);
    }
更好:为所有控制器提供一个baseController,以便控制每次调用的引导

   public class SomeController : MyBaseMvcController{
    // whatever as usual....
   }


[System.Web.Mvc.Authorize]
[MyMVCFilter]  // see the filter below.  Get the MVC pipeline to call your code on Executing
public abstract class MyBaseMvcController : Controller
{
    protected MyBaseMvcController () {
          // a place to get a NEW uow or new Context ....
    }
}

public class MyMVCFilter : System.Web.Mvc.ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext) {

     // a useful bootstrap option when you need the httpContext for bootstrap.
     BootStrapHttp(filterContext.HttpContext);
     base.OnActionExecuting(filterContext);

    }


}

当您运行应用程序时,
application\u Start
没有被调用,到底发生了什么?据我所知(几乎可以肯定我错了),application\u Start是第一件发生的事情。我在上面设置了一个断点,但从未被击中。。。就我所见,它只是继续等待服务器(使用VS development server进行调试),这肯定是运行的第一件事情之一(很可能是第一件),我从来没有让应用程序这样做过。通常当这种事情发生时(天灾),我会停下来休息一天,然后在早上重新开始;)不过,除了开玩笑,我完全不知道是什么原因造成的。要强制应用程序启动(),请先关闭服务器(IIS express)。在上下文中调用
数据库.SetInitializer()
,可能会晚一点。将其作为static
InitializeDB()中的第一条语句
   public class SomeController : MyBaseMvcController{
    // whatever as usual....
   }


[System.Web.Mvc.Authorize]
[MyMVCFilter]  // see the filter below.  Get the MVC pipeline to call your code on Executing
public abstract class MyBaseMvcController : Controller
{
    protected MyBaseMvcController () {
          // a place to get a NEW uow or new Context ....
    }
}

public class MyMVCFilter : System.Web.Mvc.ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext) {

     // a useful bootstrap option when you need the httpContext for bootstrap.
     BootStrapHttp(filterContext.HttpContext);
     base.OnActionExecuting(filterContext);

    }


}