1

就在昨天,我终于将我一直在开发的 ASP.NET 应用程序发布到了网络上。导入数据库表和数据,更改我的 web.config 中的连接字符串,所有这些都是好东西。奇怪的是,在这个生产服务器上,在看似随机的时间,页面会因为服务器错误而无法加载。你可以自己看看:

http://world-8.net/

尝试导航到“关于我们”页面或除列出的第一个播客之外的任何其他播客。您可能会遇到“对象引用未设置为对象的实例”错误。这很奇怪,因为错误中引用的代码行位于站点每个页面上 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);
    }
4

0 回答 0