0

私はこの質問を書き直しています:

私は2つのモデルを持っています。エントリーとトピック。

public class Entry
{
    public int EntryId { get; set; }
    public int UserId { get; set; }
    public int TopicId { get; set; }

    public String EntryQuestion { get; set; }
    public String EntryAnswer { get; set; }
    public int EntryReview { get; set; }
    public String QuestionValidationURL { get; set; }

    public virtual ICollection<Topic> TopicList { get; set; }
}

public class Topic
{
    public int TopicId { get; set; }
    public String TopicName { get; set; }
}

ASP.Net/MVC の例に従って、この方法でモデルをセットアップしました。私がやりたいことは、TopicId を持っているすべてのエントリ アイテムに対してですが、TopicList にアクセスしてそれを TopicName に変換したいと考えています。

私の質問は、TopicList をどのようにロードするのですか?

私がフォローしている例では、LazyLoading と EagerLoading について何かを見ていますが、機能していないようです。

Entryコントローラーから次のことを試しました:

    db.Entries.Include(x => x.TopicList).Load();

しかし、それでも0のTopicListが得られます(これはnullよりも優れています)

これどうやってするの?

私の見解では、次のようにエントリにバインドしています。

@model IEnumerable<projectInterview.Models.Entry>

ここで TopicList にアクセスしたいと思います。

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.TopicId)
        </td>
        ...
    </tr>

このループで TopicId を使用して、コレクション内のオブジェクトの一部である TopicName を表示したいと思います。

4

5 に答える 5

3

Entity Framework の例に従っていると仮定しています。私が知る限り、あなたは 1 対多の関係を作成しようとしていますが、どちらの端がどちらなのかはわかりません。

一般に、1 対多の関係を確立するには、次のようにする必要があります。

public class One
{
    [Key]
    public int Id { get; set; }

    public virtual ICollection<Many> Many { get; set; }
}

public class Many
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("One")]
    public int OneId { get; set; }
    public virtual One One { get; set; }
}

あなたがやろうとしていることが、多くのオブジェクトに関連するものEntryTopicを持っている場合、あなたはほとんどそこにいますが、何かが欠けています.

ICollection<Topic>実際に何かを含めるには、(多数の)Topicオブジェクトに (1) への外部キーが必要Entryです。(また、EF 規則に依存するのではなく、両側で主キーを明示的にマークしても害はありません。)

public class Topic
{
    [Key]
    public int TopicId { get; set; }
    public String TopicName { get; set; }

    [ForeignKey("Entry")]
    public int EntryId { get; set; }
    public virtual Entry Entry { get; set; }
}

public class Entry
{
    [Key]
    public int EntryId { get; set; }

    public int UserId { get; set; }
    public int TopicId { get; set; }

    public String EntryQuestion { get; set; }
    public String EntryAnswer { get; set; }
    public int EntryReview { get; set; }
    public String QuestionValidationURL { get; set; }

    public virtual ICollection<Topic> TopicList { get; set; }
}

これTopicListで、Include.


一方、多くのオブジェクトに関連するものTopicEntryが必要な場合は、少し逆になります。正しい方法は次のとおりです。

public class Topic
{
    [Key]
    public int TopicId { get; set; }

    public String TopicName { get; set; }

    public virtual ICollection <Entry> Entries { get; set; }
}

public class Entry
{
    [Key]
    public int EntryId { get; set; }

    public int UserId { get; set; }

    public String EntryQuestion { get; set; }
    public String EntryAnswer { get; set; }
    public int EntryReview { get; set; }
    public String QuestionValidationURL { get; set; }

    [ForeignKey("Topic")]
    public int TopicId { get; set; }
    public virtual Topic Topic { get; set; }
}

この場合、db.Entries.Include(x => x.Topic)それらを一度にすべてロードするか、オンデマンドで 1 つずつロードするかによって、使用する場合と使用しない場合があります。何を選択しても、次の式は適切な値を返す必要があります。

myEntry.Topic.TopicName
于 2013-08-08T13:44:38.853 に答える
0

Topicsコード内のどこにも初期化していないようです。コレクションが null の場合、初期化されていないことを意味します。でインスタンス化すると

ICollection<Topic> Topics = new List<Topic>();

初期化すると、 を呼び出したときにゼロを受け取るはずですTopics.Count。データベースを呼び出さないと、ゼロのままになります。

あなたの場合、インスタンス化しているかどうかを確認してくださいTopics

于 2013-08-06T06:50:37.880 に答える
0

私の意見では、問題はキャストにあります。ビューにはIEnumerable<projectInterview.Models.Entry>while Topicsis がありICollection<Topic>、これは異なるタイプのコレクションです

于 2013-08-06T04:09:11.450 に答える
0

Topics = null は、反復するトピックがリストにないことを意味します。それらをどのように埋めますか?あなたのビューは IEnumerable を期待しています トピックをエントリにどのようにキャストしますか?

元の質問に基づいて、小さな実例を追加しました。バグを見つけるのに役立つかもしれません。

コントローラ:

public class TestController : Controller
{
    public ActionResult Index()
    {
        var viewModel = new ViewModel()
        {
            Topics = new List<Topic>()
        };

        viewModel.Topics.Add(new Topic() { header = "test" });
        viewModel.Topics.Add(new Topic() { header = "test2" });

        return View(viewModel);
    }

}

モデル:

public class ViewModel
{
    public virtual ICollection<Topic> Topics { get; set; }

    public int getCount()
    {
        return Topics.Count;
    }
}

public class Topic
{
    public string header { get; set; }
}

意見:

@model testProject.Models.ViewModel
@{
   ViewBag.Title = "Index";
}

<h2>Index</h2>
@Model.getCount()

@foreach(var item in Model.Topics)
{
    <div>@item.header</div>
}

出力:

インデックス 2 テスト test2

于 2013-08-06T06:00:58.800 に答える