2016-05-18 5 views
0

私は、ASP.net、Entity Framework、およびコードファーストを使用してTwitterクローンに取り組んでいます。私はthisチュートリアルを使ってEFを始めました。私はそれを経験していないからです。私は「ツイート」の作者を欲しがるまで、すべてうまく行く。データベース内の外部キーはnullではありませんが、ビューではNULLです

これは私のkweetモデルクラスです:

public class Kweet 
{ 

    public int ID { get; set; } 

    [Required] 
    public KwetterUser Author { get; set; } 

    public string Content { get; set; } 

    public string PostedFrom { get; set; } 

    public DateTime Timeplaced { get; set; } 
} 

これは私のユーザモデルクラスです:

public class KwetterUser 
{ 
    public int KwetterUserID { get; set; } 

    public string Username { get; set; } 

    public string Realname { get; set; } 

    public string Location { get; set; } 

    public string Web { get; set; } 

    public string Bio { get; set; } 

    public virtual ICollection<Kweet> kweets { get; set; } 

    public virtual ICollection<Follow> follow { get; set; } 
} 

これは、ビューにKweetsのリストを送信するために使用されるコードであります

public ActionResult Index() 
{ 
    return View(db.Kweets.ToList()); 
} 

これは、Kweetの著者を取得するために使用されるコードです。

@foreach (var item in Model) { 
<tr> 
    <td> 
     @Html.DisplayFor(modelItem => item.Content) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Author.Username) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Timeplaced) 
    </td> 
</tr> 
} 

サーバーエクスプローラでデータベースをチェックすると、すべてが正しいデータで満たされます。 KwetterUserIDはAuthorフィールドなどにあるので、なぜうまくいかないのか分かりません。

+0

"機能しません"について詳しく説明する必要があります。 –

答えて

3

次は問題を解決していますか?

public ActionResult Index() 
{ 
    return View(db.Kweets.Include(k=>k.Author).ToList()); 
} 

それがない場合は、熱心に関連するデータをロードする程度msdn articleを見てみましょう。関連する部分は次のとおりです。 エンティティフレームワークは、関連するデータを読み込む3つの方法をサポートしています - 熱心な読み込み、遅延読み込み、明示的な読み込み。熱心

積極的なロードをロード

は、エンティティのタイプのクエリは、クエリの一部として関連するエンティティをロードするプロセスです。 Eagerの読み込みは、Includeメソッドを使用して行います。たとえば、以下のクエリは、ブログや各ブログに関連するすべての投稿を読み込みます。

/ Load all blogs and related posts 
var blogs1 = context.Blogs 
         .Include(b => b.Posts) 
         .ToList(); 

遅延読み込み

遅延ロードは、エンティティのエンティティまたはコレクションが自動的にデータベースからエンティティ/エンティティを参照するプロパティにアクセスすることが初めてロードされるプロセスです。 POCOエンティティタイプを使用する場合、派生したプロキシタイプのインスタンスを作成し、仮想プロパティをオーバーライドしてロードフックを追加することによって、遅延ロードを実現します。

は、明示的であっても、それを遅延に関連するエンティティをロードすることは可能ですが、それは明示的な呼び出しを行う必要があります無効に遅延ロードで

をロードします。これを行うには、関連するエンティティのエントリに対してLoadメソッドを使用します。たとえば、

var post = context.Posts.Find(2); 

// Load the blog related to a given post 
context.Entry(post).Reference(p => p.Blog).Load(); 
+0

これは役に立ちますが、それが役に立った理由のためにいくつかの単語を追加する必要があります; o) –

+1

本当に問題になった場合のための詳細とリンクを追加しました –

0

ビューモデルに必要な変数のみを選択する方が効率的です。

db.Kweets.Select(c => new KweetList() 
    { 
     Content = c.Content, 
     AuthorName = c.Author.Username, 
     TimePlaced = c.TimePlaced 
    }).ToList() 
関連する問題