Asp.net 实体框架:上下文在看似随机的时间未及时准备好以供请求,仅限于生产环境
就在昨天,我终于在网上发布了我一直在开发的ASP.NET应用程序。导入了数据库表和数据,更改了我的web.config中的连接字符串,所有这些都很好。奇怪的是,在这个生产服务器上,由于服务器错误,在看似随机的时间,页面将无法加载。你可以自己看看: 尝试导航到类似页面的内容,或除第一个列出的播客以外的任何其他播客。您可能会遇到“对象引用未设置为对象实例”错误。这很奇怪,因为错误中引用的代码行位于Site.Master在站点的每个页面上使用的部分视图中(在尝试检索有关最新播客插曲的信息时)。在访问HomeController控制的页面时,我还没有遇到过这个错误。ArticleController或AdminController控制的任何东西都喜欢在第一次查看时爆炸。在访问列表上的第一个播客之后,事情往往会顺利进行一段时间(http://world-8.net/podcast/world-8-50c--pax-2012-part-3/52/)在尝试导航到其他任何地方之前。但这只是暂时的 在我的模型结构中,播客和文章是一对一的关系。文章有一个PodcastId属性,但这不是一个FK,因为不是每一篇文章都是关于一个podcast的。在显示文章信息时,我只需要有关Podcast对象的信息 这几乎就好像数据上下文试图“赶上”模型创建过程,而没有及时完成请求处理。我自己从来没有看到过这个具体的错误,但该网站的一位用户非常友好地向我展示了他在这方面所看到的: 对我来说真是令人困惑的行为;我在开发环境中从未遇到过这个问题。而且它的不一致性使得我很难确定问题所在 如果有人更精通EntityFramework,可以对此有所了解,我将不胜感激 希望对您有所帮助的一些代码示例: 在我的模型命名空间中:Asp.net 实体框架:上下文在看似随机的时间未及时准备好以供请求,仅限于生产环境,asp.net,sql-server-2008,entity-framework-4,datacontext,production-environment,Asp.net,Sql Server 2008,Entity Framework 4,Datacontext,Production Environment,就在昨天,我终于在网上发布了我一直在开发的ASP.NET应用程序。导入了数据库表和数据,更改了我的web.config中的连接字符串,所有这些都很好。奇怪的是,在这个生产服务器上,由于服务器错误,在看似随机的时间,页面将无法加载。你可以自己看看: 尝试导航到类似页面的内容,或除第一个列出的播客以外的任何其他播客。您可能会遇到“对象引用未设置为对象实例”错误。这很奇怪,因为错误中引用的代码行位于Site.Master在站点的每个页面上使用的部分视图中(在尝试检索有关最新播客插曲的信息时)。在访问
public class Article
{
public int Id { get; set; }
public string Title { get; set; }
public int UserId { get; set; }
public string AuthorName { get; set; }
public string Content { get; set; }
public string ArticleType { get; set; }
public DateTime PublishDate { get; set; }
public int PodcastId { get; set; }
public Podcast ArticlePodcast { get; set; }
public virtual ICollection<ArticleComment> Comments { get; set; }
}
public class Podcast
{
public int Id { get; set; }
public string Title { get; set; }
public string MP3path { get; set; }
public string Description { get; set; }
public DateTime PublishDate { get; set; }
public string Duration { get; set; }
public virtual ICollection<PodcastTimestamp> Timestamps { get; set; }
public virtual ICollection<PodcastGuest> Guests { get; set; }
}
public class BaseController : Controller
{
public static PodcastRepository _podcastRepository = new PodcastRepository();
public static ArticleRepository _articleRepository = new ArticleRepository();
public static UserRepository _userRepository = new UserRepository();
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
ViewData["MostRecentEpisode"] = _articleRepository.GetMostRecentPodcastArticle();
base.OnActionExecuted(filterContext);
}
}
[HandleError]
public class HomeController : BaseController
{
public ActionResult Index()
{
var pageNumber = 0;
if(!string.IsNullOrWhiteSpace(Request.QueryString["p"]))
{
pageNumber = int.Parse(Request.QueryString["p"]);
}
var category = Request.QueryString["category"] ?? "";
ViewData["Articles"] = _articleRepository.GetOnePageOfArticles(pageNumber, category);
if (!string.IsNullOrEmpty(Request.QueryString["category"]))
{
ViewData["TotalArticleCount"] = _articleRepository.GetArticlesByType(category).Count();
}
else
{
ViewData["TotalArticleCount"] = _articleRepository.GetAllArticles().Count();
}
return View();
}
public ActionResult AboutUs()
{
return View();
}
}
public class ArticleController : BaseController
{
public ActionResult Article(int aId)
{
ViewData.Model = _articleRepository.GetArticleById(aId);
return View();
}
}
编辑:应MilkyWayJoe的请求,在My Global.asax.cs中编辑我的应用程序\u Start()方法
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
Database.SetInitializer<EF4DataContext>(null);
}
受保护的无效应用程序\u Start()
{
RegisterAllAreas();
注册地址(RouteTable.Routes);
Database.SetInitializer(null);
}
只是一个想法。。你在global.asax.cs或context类上有任何类型的播种吗?@MilkyWayJoe恐怕我不熟悉这个上下文中“播种”的定义。但我已经在Global.asax.cs中发布了我的应用程序_Start()方法,如果有任何相关的内容。我只是想知道,因为问题的标题让我认为EF正在清理您的数据并重新创建它,好像您有一些设置来破坏数据库并在某处为其添加测试数据。。就像我说的,只是一个想法……我在其他地方看到过这个答案,也许你可以试试:()@MilkyWayJoe:我试了一下,在我的每个控制器中设置了DataContext之后,添加了一行“DataContext.Database.Initialize(force:false);”。这似乎没有影响任何事情(
public class BaseController : Controller
{
public static PodcastRepository _podcastRepository = new PodcastRepository();
public static ArticleRepository _articleRepository = new ArticleRepository();
public static UserRepository _userRepository = new UserRepository();
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
ViewData["MostRecentEpisode"] = _articleRepository.GetMostRecentPodcastArticle();
base.OnActionExecuted(filterContext);
}
}
[HandleError]
public class HomeController : BaseController
{
public ActionResult Index()
{
var pageNumber = 0;
if(!string.IsNullOrWhiteSpace(Request.QueryString["p"]))
{
pageNumber = int.Parse(Request.QueryString["p"]);
}
var category = Request.QueryString["category"] ?? "";
ViewData["Articles"] = _articleRepository.GetOnePageOfArticles(pageNumber, category);
if (!string.IsNullOrEmpty(Request.QueryString["category"]))
{
ViewData["TotalArticleCount"] = _articleRepository.GetArticlesByType(category).Count();
}
else
{
ViewData["TotalArticleCount"] = _articleRepository.GetAllArticles().Count();
}
return View();
}
public ActionResult AboutUs()
{
return View();
}
}
public class ArticleController : BaseController
{
public ActionResult Article(int aId)
{
ViewData.Model = _articleRepository.GetArticleById(aId);
return View();
}
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
Database.SetInitializer<EF4DataContext>(null);
}