2011-06-15 93 views
0

我相当确定这是一个延迟加载问题,但在阅读了关于延迟加载之后,我仍然没有更接近解决方案。我已经尝试过延迟加载和关闭,但没有成功。当我从数据库中拉出一个节点时,即使这些对象存在于数据库中,Parent和Children也是null。如何从数据库中读取对象时加载相关对象?

我还添加了'IsReference = true'作为解决此问题的尝试。

我让对象引用的数据成员在一个点上是虚拟的,但是我有代理的序列化问题。

DatabaseContext.cs

public class DatabaseContext : DbContext 
{ 
    public DatabaseContext() : base("DatabaseName") 
    { 
    Configuration.LazyLoadingEnabled = false; 
    } 
    public DbSet<Node> Nodes { get; set; } 
} 

Node.cs

[DataContract(IsReference = true)] 
public partial class Node 
{ 

    [DataMember] 
    public long ID { get; private set; } 

    [DataMember] 
    public Node Parent { get; set; } 

    [DataMember] 
    public ICollection<Node> Children { get; set; } 

} 
+0

这看起来不像一个懒加载问题,你的Children集合没有标记为虚拟的,所以应该已经实现了节点 - 你确定在DB中有相关的子注释吗? – BrokenGlass 2011-06-15 15:55:41

+0

是的。如果我加载所有节点(即var nodes = context.Nodes.ToList()),那么所有的关系都存在。如果我加载一个节点(即var node = context.Nodes.Find(1)),那么所有的关系都是空的。当我将它们标记为虚拟时,它实际上在加载一个节点时起作用,但是我又遇到了序列化问题。我想我可以尝试解决这些问题,但我宁愿有一个解决方案。 – OpticalDelusion 2011-06-15 15:57:48

回答

0

我最终经过包括我想作为参数(你可以使用实际类型或str ),然后我打开包含,因为它们返回DbQuery对象,并且实际上不查询数据库。感谢您输入@moi_meme(+1)。

foreach (var include in includes) 
{ 
    query = query.Include(include); 
} 
2

Loading Related Objects

最简单的方法是在你的查询中使用.Include("Parent").Include("Children")

+0

我有很多关系很多的对象,做10次包括每次我想要一些对象都很荒谬。上面的代码是为了例子。 – OpticalDelusion 2011-06-15 15:58:10