0

コメントできるニュースサイトを作ろうとしています。私はpluralsight.comのガイドをフォローしてきましたが、レターのガイドで行われていることに従いましたが、実行時にモデルの内部をデバッグして見ると、コメントは含まれていません。

私のDBクラス:

public class ProjectDB {
        public DbSet<ContentNode> ContentNodes{ get; set; }
        public DbSet<Comment> Comments { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {

            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<ContentNode>()
                .Property(n => n.ID).HasColumnName("NodeID");
            modelBuilder.Entity<ContentNode>()
                .HasMany(node => node.Comments)
                .WithRequired(comment => comment.Node);
        }
}

関係するモデル:

    public class ContentNode : Node
    {
        public ContentType ContentType { get; set; }
        public ContentCategory Category { get; set; }
        public ICollection<Comment> Comments { get; set; }

        public ContentNode()
        {
            Comments = new List<Comment>();
        }
    }

    public class Comment
    {
        public int ID { get; set; }
        public ContentNode Node { get; set; }
        public string Body { get; set; }
    }

データベースからニュース記事を取得してビューに送信するコントローラー メソッド

[GET("frettir/{year}/{month}/{day}/{title}")]
public ActionResult GetArticle( int year, int month, int day, string title)
{
    var model = (from f in _db.ContentNodes
                 where f.dateCreated.Year == year &&
                       f.dateCreated.Month == month &&
                       f.dateCreated.Day == day &&
                       f.Title == title &&
                       f.ContentType.ID == 1
                 select f).Single();

    return View(model);
}

そして最後に、ビュー自体:

@model Project.Models.ContentNode

@{
    ViewBag.Title = "GetByID";
}

<h2>GetByID</h2>

<fieldset>
    <legend>News</legend>

    <div class="display-label">
         @Html.DisplayNameFor(model => model.Title)
    </div>
    <div class="display-field">
        @Html.DisplayFor(model => model.Title)
    </div>

    <div class="display-label">
         @Html.DisplayNameFor(model => model.Body)
    </div>
    <div class="display-field">
        @Html.DisplayFor(model => model.Body)
    </div>

    <div class="display-label">
         @Html.DisplayNameFor(model => model.dateCreated)
    </div>
    <div class="display-field">
        @Html.DisplayFor(model => model.dateCreated)
    </div>
</fieldset>
<p>
    @Html.ActionLink("Edit", "Edit", new { id=Model.ID }) |
    @Html.ActionLink("Back to List", "Index")
</p>

    @foreach (var item in Model.Comments)
    {
        @Html.Partial("_Comment",item)
    }

@Html.ActionLink("New comment", "Create", "Comment", new { NodeID = Model.ID }, null)

私は例を見て、ビデオガイドを何十回も見て、何が間違っていたかを確認しました。私が思いついた唯一の解決策は、 NodeContent テーブルを Comments テーブルに結合し、それを別のモデルに投影することですが、収集できるものからは必要ありません。

どんな助けでも大歓迎です。

4

2 に答える 2

2
var model = _db.ContentNodes
    .Include(f => f.Comments) // eager load the child collection
    .Single(f => f.dateCreated.Year == year 
         && f.dateCreated.Month == month
         && f.dateCreated.Day == day 
         && f.Title == title 
         && f.ContentType.Id == 1);
于 2012-10-23T13:48:20.160 に答える
0

これは、Entity Framework が既定で遅延読み込みを有効にしていることが原因である可能性が最も高いです。Firstメソッドの代わりに メソッドを使用して、クエリを明示的に強制的に実行できますSingle

var model = (from f in _db.ContentNodes
             where f.dateCreated.Year == year &&
                   f.dateCreated.Month == month &&
                   f.dateCreated.Day == day &&
                   f.Title == title &&
                   f.ContentType.ID == 1
             select f).First();
return View(model);
于 2012-10-23T13:40:04.740 に答える