EntityFramework 6.如何获取相关对象?

时间:2015-09-09 12:59:05

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

我的项目中有两个或更多相关的表。 并且需要获得相关的对象。

以下是我的所作所为: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加载方法。

我的代码应该更正?

3 个答案:

答案 0 :(得分:2)

正如我在您的代码中看到的那样,您已停用延迟加载Configuration.LazyLoadingEnabled = false;。因此,您需要以这种方式包含子项:

_db.Document.Include("Comment").ToList()

您可以考虑阅读:

答案 1 :(得分:2)

您可以使用预先加载来获取相关实体,通过使用Include方法实现Eager加载:

_db.Document.Include("Comment").ToList();

More info

更新:您不需要在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

使用复数名称是一个很好的约定