外键在数据库中不为null,但在View中为null

时间:2016-05-18 19:50:11

标签: c# asp.net asp.net-mvc entity-framework

我正在使用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位于作者字段等中。所以我不知道为什么它不起作用。

2 个答案:

答案 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()