ちょうど昨日、私が取り組んできた ASP.NET アプリケーションをついに Web に公開しました。データベース テーブルとデータをインポートし、web.config の接続文字列を変更しました。奇妙な点は、この運用サーバーでは、一見ランダムな時間に、サーバー エラーが原因でページの読み込みに失敗することです。あなたは自分で見ることができます:
About Usページや、最初にリストされたポッドキャスト以外のポッドキャストなどに移動してみてください。「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが発生する可能性があります。エラーで参照されているコード行は、サイトのすべてのページの Site.Master で使用される部分ビューにあるため、これは奇妙です (最新のポッドキャスト エピソードに関する情報を取得しようとしているときです)。HomeController によって制御されるページにアクセスするだけで、このエラーが発生したことはまだありません。ArticleController または AdminController によって制御されるものはすべて、最初のビューで爆発するのが好きです。リストの最初のポッドキャスト (http://world-8.net/podcast/world-8-50c--pax-2012-part-3/52/) にアクセスしてから、しばらくはスムーズに進む傾向があります。他の場所に移動します。
私のモデル構造では、ポッドキャストと記事は 1 対 1 の関係にあります。記事には 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;
}
そして、私の Controllers 名前空間で:
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);
}