当前位置: 首页 > 知识库问答 >
问题:

实体框架4自连接-延迟加载父对象和子集合

濮景龙
2023-03-14

我正在尝试使用entity framework 4实现自连接,我的用例如下:

public class Category
{
    /// <summary>
    /// category id
    /// </summary>
    [Key]
    [DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
    public int CatID { get; set; }

    /// <summary>
    /// category name
    /// </summary>
    [Required(ErrorMessage="Vui lòng nhập tên.")]
    [MaxLength(100, ErrorMessage="Tên chỉ có độ dài tối đa 100 ký tự.")]
    public string CatName { get; set; }

    /// <summary>
    /// parent category id
    /// self join :)
    /// </summary>
    public int? ParentID { get; set; }

    /// <summary>
    /// parent category
    /// </summary>
    [ForeignKey("ParentID")]
    public virtual Category ParentCategory { get; set; }

    /// <summary>
    /// products list
    /// </summary>
    public virtual IEnumerable<Product> Products { get; set; }

    /// <summary>
    /// categories which are associate with this category
    /// </summary>
    public virtual IEnumerable<Category> Categories { get; set; }
}

如您所见,子类别将通过外键引用父类别。有了这个实现,我可以通过使用外键属性延迟加载ParentCategory。但子集合分类并不是延迟加载。如何强制延迟加载子集合?

编辑

如果我没有过滤结果集,则父集合和子集合的延迟加载将正常工作:

var cat = context.Category.ToList();

Buf如果我过滤结果集,则不会延迟加载子集合

var cat = from entity in context.Category
          where entity.Parent == null
          select entity;
//child collection will be null

共有1个答案

郭单鹗
2023-03-14

使用“包含”方法加载集合:

var selectedList = entity.where(m=>m.parent==null).include(m=>m.Categories).tolist();
 类似资料:
  • 考虑以下(非常简化的)实体: 在我的映射器中,我可以设置用户罚款,但是一旦执行以下代码(在数据库中保留任何更改之前)

  • 我定义了两个具有一对多外键关系的类,它们首先由数据库生成。 我创建了一个代理对象,并将其添加到DBContext中。 然后我设置了一个外键属性并尝试访问相应的导航属性。 设置外键属性标签\u id不会加载导航属性标签。代码中的最后一行返回。 这些类遵循此处列出的创建POCO代理的要求(调试显示已创建代理car对象,因此我相信所有要求都已满足)。 数据库表标签包含主键为4的项。 我不是在这里调用或,

  • 我从这个网站上读到了关于懒惰加载的内容。启用或禁用LazyLoding “如果我们请求已启用LazyLoading的学生列表,数据提供程序将从数据库中获取所有学生,但每个StudentAddress属性在显式访问该属性之前不会加载。” 此语句表示,当我将设置为true时,将不会加载相关数据。然而 如果我设置延迟加载启用=true,上面的代码返回所有特技与他们的老师和地址。我在这里错过了什么?有人能

  • 我正在使用Play Framework v.2.6.3和用于SQL访问的JPA解决方案。 当我在实体上设置FetchType.Lazy时,我会收到以下错误消息: play.api.http。HttpErrorHandlerExceptions$$anon$1:执行异常[[RuntimeException:java.lang.IllegalArgumentException:未能延迟初始化角色集合:

  • 我正在使用启用延迟加载的实体框架5。我有以下代码: 但这有意义吗?我想确保公共属性订阅从不为null。由于虚拟实体框架覆盖了getter和setter以提供延迟加载功能。 我需要这个字段还是我可以只使用一个自动属性,如果没有订阅,我得到一个空列表?

  • 当将实体模型转换为DTO时,我对Entity Framework Core(v2.0.1)有一个问题。基本上,通过该短语的任何其他版本,当我不想加载时,它是延迟加载的。这是一个简单的。NET Core Console应用程序(带有Microsoft. EntityFrameworkCore. SqlServer(2.0.1)包)。 现在,当执行方法来检索数据时,它正在执行以下SQL 如您所见,它没