【问题标题】:How can I load related objects when reading an object from the database?从数据库中读取对象时如何加载相关对象?
【发布时间】:2011-06-29 05:43:42
【问题描述】:

我相当肯定这是一个延迟加载问题,但是在阅读了延迟加载之后,我仍然没有接近解决方案。我试过打开和关闭延迟加载,但没有成功。当我从数据库中提取一个节点时,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; }

}

【问题讨论】:

  • 这看起来不像是延迟加载问题,您的 Children 集合未标记为虚拟,因此应该已通过节点实现 - 您确定 DB 中有相关的子注释吗?
  • 是的。如果我加载所有节点(即 var nodes = context.Nodes.ToList()),那么所有关系都存在。如果我加载一个节点(即 var node = context.Nodes.Find(1)),那么所有的关系都是空的。当我将它们标记为虚拟时,它实际上在加载一个节点时工作,但同样,我遇到了序列化问题。我想我可以尝试解决这些问题,但我宁愿有一个解决方案。

标签: c# entity-framework lazy-loading


【解决方案1】:

Loading Related Objects

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

【讨论】:

  • 我有很多有很多关系的对象,每次我想要一些对象时都做 10 次包含是荒谬的。上面的代码是为了举例。
【解决方案2】:

我最终将我想要的包含作为参数(您可以使用实际类型或字符串)传递给该方法,然后我循环了包含,因为它们返回 DbQuery 对象并且实际上并不查询数据库。感谢@moi_meme (+1) 的输入。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多