C# 代码优先的MVC不';开始
我首先使用代码为我的MVC应用程序开发数据库。以下是连接字符串: 它使用SQL身份验证,因为由于我尚未确定的原因,Windows Auth不允许我在服务器上执行任何操作 下面是应用程序启动() 此类调用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();
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()
,可能会晚一点。将其作为staticInitializeDB()中的第一条语句
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);
}
}