我的项目中有两个或更多相关的表。 并且需要获得相关的对象。
以下是我的所作所为:http://pastebin.com/BbkT8zvd
试着这样:
using (LocalContext _db = new LocalContext())
{
var list = _db.Document.ToList();
foreach (var item in list)
{
Console.WriteLine(item.Name+ ": ");
foreach (var item2 in item.Comment)
{
Console.WriteLine(item2.CommentText);
}
}
}
它不会返回与文档相关的注释。
尝试了Lazy,Eager和Explicit加载方法。
我的代码应该更正?
答案 0 :(得分:2)
正如我在您的代码中看到的那样,您已停用延迟加载Configuration.LazyLoadingEnabled = false;
。因此,您需要以这种方式包含子项:
_db.Document.Include("Comment").ToList()
您可以考虑阅读:
答案 1 :(得分:2)
您可以使用预先加载来获取相关实体,通过使用Include方法实现Eager加载:
_db.Document.Include("Comment").ToList();
更新:您不需要在Document
课程中初始化Comment
,您的Comment
课程应该是这样的:
public class Comment
{
public int Id { get; set; }
public int DocId { get; set; }
public string CommentText { get; set; }
public virtual Document Document { get; set; }
}
Document
上课:
public class Document
{
public Document()
{
this.Comment = new HashSet<Comment>();
}
public int Id { get; set; }
public string Name { get; set; }
public string Title { get; set; }
public virtual ICollection<Comment> Comment { get; set; }
}
查询:
var list = _db.Document.Include("Comment").ToList();
在这种情况下,将加载所有相关的评论。
答案 2 :(得分:0)
将评论类中的 DocId 属性重命名为 DocumentId - 使用CodeFirst方法时,必须注意这些命名。
LazyLoading设置为true通常应该可以解决问题。尝试设置它并在通话中包含导航属性:
_db.Document.Include("Comment").ToList
PS:对表和dbsets
使用复数名称是一个很好的约定