0

4つの関連テーブルがあります:Project-> ProjectDoc-> Comment-> CommentReply&Usersこれらのテーブルのうち3つはUsersに関連しています。User.FirstName値を取得しようとすると、次のことを示す例外が表示されます。

Object reference not set to an instance of an object.

したがって、最初にユーザーモデル。

public class User
{
    public int UserID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public virtual ICollection<Comment> Comment { get; set; }
    public virtual ICollection<CommentReply> CommentReply { get; set; }
    public virtual ICollection<Project> Project { get; set; }
}

次に、プロジェクトモデル。

public class Project
{
    public int ProjectID { get; set; }
    public int UserID { get; set; }
    public string Title { get; set; }
    public virtual ICollection<ProjectDoc> ProjectDoc { get; set; }
    public User User { get; set; }
}

今かみそりのビュー。例外にラベルを付けました。

@Model.User.FirstName   //exception

@foreach (var doc in Model.ProjectDoc)
{
    @doc.DocTitle
    <br />  
       <div>
           @doc.Comment.Count() comments
       </div>
   foreach (var comment in doc.Comment)
   { 
       <div>
        @comment.CommentVote.Count() 
        votes
        @comment.UserID - user ID<br />

        @comment.User.FirstName  //exception
        @comment.Text
       </div>
       <br />
       foreach (var creply in comment.CommentReply)
       {

          @creply.User.FirstName   //exception
          <br />
          @creply.Text
          <br />
       }
   }
}

User.FirstName行を削除すると、正常に機能します。FirstName値を取得するには、何を変更する必要がありますか?あなたは助けるためにもっと多くの情報が必要ですか?

更新:それが役立つなら、私のコントローラー。

    // GET: /Projects/Details/5

    public ActionResult Details(int id = 0)
    {
        Project project = db.Projects.Find(id);
        if (project == null)
        {
            return HttpNotFound();
        }
        return View(project);
    }

コントローラーもこれに変えてみましたが、うまくいきませんでした

      Project project = db.Projects
          .Include(i => i.User)
          .SingleOrDefault(x => x.ProjectID == id);

アップデート2:流暢なAPIマッピングの問題?

UserIDフィールドには値がありますが、User_UserIDの値はNULLであるため、流暢なAPIマッピングを誤って行っていると思います(User_UserID列は必要ありません)。

 modelBuilder.Entity<User>()
      .HasMany(p => p.Project)
      .WithRequired()
      .HasForeignKey(c => c.UserID)
      .WillCascadeOnDelete(false);

それが問題の原因ですか?

4

2 に答える 2

1

エンティティの遅延読み込みを使用したいと思います...それを機能させるには、ナビゲーション プロパティを仮想としてマークする必要があるため、EF は必要に応じてプロキシ クラスを使用してデータを読み込むことができます。

モデルUserでは、クラスのプロパティはProject仮想としてマークされていないため、遅延読み込みは機能しません。

Userプロパティを仮想にするか、Include メソッドを使用して遅延読み込みなしでデータを読み込むことができます。

于 2012-12-14T20:01:15.207 に答える
0

遅延読み込みに関する注意事項...私が知る限り、データベースから ProjectDoc のリストを取得しているだけです。次に、各 ProjectDoc に目を通し、各ドキュメントに対してナビゲーション プロパティ (@doc.Comment) を使用し、コメントごとにコメントの返信を確認します。

私が間違っていなければ、これらの呼び出しのそれぞれがデータベースにアクセスしています。アイテムごとにデータベースにアクセスするのではなく、必要なすべてのデータを 1 つのクエリで取得することを検討することをお勧めします。

n+1 選択問題を見てください。

于 2012-12-14T22:07:59.437 に答える