我正在改写这个问题:
我有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。
答案 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>
而Topics
是ICollection<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
。