我正在使用ASP.net,Entity Framework和Code First开发Twitter克隆。我使用this教程开始使用EF,因为我对它没有任何经验。一切顺利,直到我想要获得“推文”的作者。
这是我的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>
}
奇怪的是,当我使用Server Explorer检查我的数据库时,所有内容都填充了正确的数据。 KwetterUserID位于作者字段等中。所以我不知道为什么它不起作用。
答案 0 :(得分:3)
以下是否解决了您的问题?
public ActionResult Index()
{
return View(db.Kweets.Include(k=>k.Author).ToList());
}
如果是,请查看msdn article关于急切加载相关数据的信息。相关部分是: 实体框架支持三种加载相关数据的方法 - 急切加载,延迟加载和显式加载。
急切加载
预先加载是一种过程,即对一种类型的实体的查询也会将相关实体作为查询的一部分加载。通过使用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();
答案 1 :(得分:0)
只选择所需的变量进入视图模型会更有效。
db.Kweets.Select(c => new KweetList()
{
Content = c.Content,
AuthorName = c.Author.Username,
TimePlaced = c.TimePlaced
}).ToList()