就在昨天,我终于将我一直在开发的 ASP.NET 应用程序发布到了网络上。导入数据库表和数据,更改我的 web.config 中的连接字符串,所有这些都是好东西。奇怪的是,在这个生产服务器上,在看似随机的时间,页面会因为服务器错误而无法加载。你可以自己看看:
尝试导航到“关于我们”页面或除列出的第一个播客之外的任何其他播客。您可能会遇到“对象引用未设置为对象的实例”错误。这很奇怪,因为错误中引用的代码行位于站点每个页面上 Site.Master 中使用的部分视图中(这是在尝试检索有关最新播客剧集的信息时)。只是访问由 HomeController 控制的页面时,我还没有遇到此错误。任何由 ArticleController 或 AdminController 控制的东西都喜欢在第一次查看时爆炸。在访问列表中的第一个播客 (http://world-8.net/podcast/world-8-50c--pax-2012-part-3/52/) 之后,事情往往会顺利进行一段时间,然后再尝试导航到其他任何地方。
在我的模型结构中,播客和文章是一对一的关系。Article 具有 PodcastId 属性,但这不是 FK,因为并非每篇文章都与播客有关。在显示有关文章的信息时,我只需要有关 Podcast 对象的信息。
就好像数据上下文正试图“赶上”模型创建过程并且没有及时完成请求以完成处理。我自己从未见过这个特定的错误,但该网站的用户很友好地向我展示了他看到的内容:http: //t.co/hjHcyqxt
The context cannot be used while the model is being created.
对我来说真是令人困惑的行为;我在开发环境中从未遇到过这个问题。而且它的不一致性质使我很难确定问题所在。
如果有任何人更精通 EntityFramework 可以对此有所了解,我将不胜感激!
一些希望有帮助的代码示例:
在我的模型命名空间中:
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; }
}
在我的 EntityFramework 命名空间(存储库)中:
public class EF4DataContext: DbContext
{
public EF4DataContext(string conString):base(conString)
{
}
public DbSet<User> Users { get; set; }
public DbSet<Article> Articles { get; set; }
public DbSet<ArticleComment> ArticleComments { get; set; }
public DbSet<Podcast> Podcasts { get; set; }
public DbSet<PodcastTimestamp> PodcastTimestamps { get; set; }
public DbSet<PodcastGuest> PodcastGuests { get; set; }
public DbSet<Product> Products { get; set; }
}
public abstract class BaseRep
{
public EF4DataContext DataContext { get; set; }
public ObjectContext ObjectContext { get; set; }
}
public class ArticleRepository : BaseRep
{
public ArticleRepository()
{
DataContext = new EF4DataContext(ConfigurationManager.AppSettings["ConnectionInfo"]);
ObjectContext = ((IObjectContextAdapter)DataContext).ObjectContext;
}
}
public Article GetMostRecentPodcastArticle()
{
var art = DataContext.Articles.Where(a => a.ArticleType.Equals("Podcast")).OrderByDescending(a => a.PublishDate).FirstOrDefault();
art.Comments = GetArticleCommentsByArticleId(art.Id);
return art;
}
在我的控制器命名空间中:
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();
}
}
编辑:我的 Global.asax.cs 中的 Application_Start() 方法,应 MilkyWayJoe 的要求
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
Database.SetInitializer<EF4DataContext>(null);
}