代码优先的MVC不会开始
本文关键字:开始 MVC 代码 | 更新日期: 2023-09-27 18:03:16
我首先使用代码来开发我的MVC应用程序的数据库。
它使用SQL身份验证,因为我还没有确定的原因,Windows认证不允许我在服务器上做任何事情…
这是Application_Start ():
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
OrtundDB.InitializeDB();
}
这个类调用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
}
我以前用同样的方法构建了一个MVC应用程序,这个方法有效。然而,这甚至不会每次都执行Application_Start()
。
在奇怪的情况下,它已经执行了Application_Start,它一直执行db.Database.Initialize(true);
,在这一点上,它似乎永远不会结束。我没有得到错误,但操作似乎没有完成。
当涉及到MVC时,我有点新手,所以我不知道问题可能是什么或如何修复它。
任何帮助解决这个问题(并可能解释导致这个问题的原因)将不胜感激。
提前感谢!
也许问题在于您对Application_Start
的期望。
当应用程序被加载到IIS上的应用程序池中时,Application_Start
被调用一次。只有当应用程序池被回收或IIS重新启动时,它才会被再次调用。
读取IIS管道需要10-15分钟这将有助于了解正在发生的事情。
由于我对线程和请求的错误期望,我有一个讨厌的错误。
要考虑的备选方案,并在调试中测试,看看它们是否适合您:
INIT在Global。asax
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 以便控制每次调用的bootstrap
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);
}
}