模型计数= null

时间:2013-08-06 03:45:32

标签: asp.net-mvc

我正在改写这个问题:

我有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。

5 个答案:

答案 0 :(得分:3)

我假设您正在关注实体框架示例。据我所知,你正试图创建一对多的关系,尽管我不确定哪个是哪个。

在一般情况下,要建立一对多关系,您必须执行以下操作:

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; }
}

如果您要做的是一个Entry与许多Topic 对象有关,那么您几乎就在那里,但是您缺少某些东西。< / p>

对于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


另一方面,如果您希望与许多Topic 对象相关的一个Entry,那么您可以稍微向下一点。正确的方法是:

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),也可以不使用myEntry.Topic.TopicName ,具体取决于您是希望它们是一次性加载还是按需逐个加载。{1}}无论您选择什么,以下表达式都应返回正确的值:

{{1}}

答案 1 :(得分:1)

如果我理解正确,您已将主题列表添加到条目中,以便在显示条目时获取主题的名称。实现此目的的最佳方法是在您的条目模型中实际拥有Topic属性。所以你的模型看起来像这样:

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; }
    //Change this.....
    public virtual Topic Topic { get; set; }
}

然后在您的视图中,您将使用(假设Model是IEnumerable):

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

此链接有一个很好的示例,说明如何执行此操作: http://weblogs.asp.net/manavi/archive/2011/03/28/associations-in-ef-4-1-code-first-part-2-complex-types.aspx

答案 2 :(得分:0)

在我看来,问题在于铸造。在视图中您有IEnumerable<projectInterview.Models.Entry>TopicsICollection<Topic>,这是一个不同类型的集合

答案 3 :(得分: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

答案 4 :(得分:0)

您似乎没有在代码中的任何位置初始化Topics。如果集合为null,则表示它未初始化。如果用

实例化它
ICollection<Topic> Topics = new List<Topic>();

初始化后,您应该在致电Topics.Count时收到零。如果您不调用数据库,它将保持为零。

在您的情况下,检查您是否正在实例化Topics