我已经定义了一个模型Item,它具有以下属性:
public class Item
{
public bool Active { get; set; }
public string ItemCode { get; set; }
public int ItemId { get; set; }
public string Name { get; set; }
public Category Category { get; set; }
public int CategoryId { get; set; }
}
我试图在Item控制器的详细视图中引用Category。我在控制器中的代码是:
public ActionResult Details(int id = 0)
{
Item item = db.Items.Find(id);
if (item == null)
{
return HttpNotFound();
}
return View(item);
}
但是,当我在这里探索item对象时,我可以看到CategoryId被正确设置,Category属性被设置为null。因此,当我引用Item.Category.Name时,我得到一个空白的结果。我已经尝试将我的属性设置为虚拟(遵循在线教程),但这似乎没有解决问题。我做错了什么?
答案 0 :(得分:2)
您可以通过将Category
标记为虚拟来延迟加载该属性:
public virtual Category Category { get; set; }
一旦您访问Category
属性,这将向数据存储发送另一个查询,询问相关类别。例如item.Category.Name
。
或者您可以使用Include
方法急切加载类别:
Item item = db.Items
.Include(item => item.Category)
.FirstOrDefault(item => item.ID == id);
这将从1个查询中的数据存储中检索包含相关类别的项目。请注意,我在FirstOrDefault
使用Find
代替this article,因为Include
的返回类型为IQueryable<T>
而非DbSet<T>
。
有关加载相关数据的详情,请参阅{{3}}。