2015-09-09 80 views
0

我在我的项目中有两个以上的相关表格。 并需要获取相关对象。EntityFramework 6.如何获取相关对象?

这里是我做过什么: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); 
     } 
    }  
} 

它没有返回与文档相关评论。

试过懒惰,急切和明确的加载方法。

我应该在我的代码中更正什么?

回答

2

您可以使用预先加载用于获取相关的实体,预先加载通过使用包含方法来实现:

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

More info

更新:你并不需要在Comment类初始化Document,你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(); 

在这种情况下,所有相关的评论将被加载。使用你必须要小心这些namings CodeFirst方法时 -

+0

@GertArnold我已经更新了我的答案。 –

+0

在Comment的构造函数中初始化'Document'是解决这个问题的关键。它阻止关系修复。另请参阅[本问答](http://stackoverflow.com/q/20757594/861716),我已更新以覆盖此案例。 –

0

在您的评论类的docId属性重命名为DocumentId

LazyLoading设置为true通常应该做的伎俩。尝试设置它,还包括在你的电话的导航属性:

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

PS:这是使用复数名称为表和dbsets

+0

*尝试懒惰,急切和明确的加载方法。* –

+0

看看我的答案的第一部分 - EF可能无法识别您的外键。这就是为什么你应该重新命名它或用适当的属性装饰它。 – stann1

+0

它正确映射。顺便说一下,这不是我的代码。 –