Entity framework .Net核心EF包括手段

Entity framework .Net核心EF包括手段,entity-framework,entity-framework-core,Entity Framework,Entity Framework Core,嗨,我刚开始做一个项目。我看到了上下文查询行。它包含实体,然后再次包含。 我不明白这是什么意思。我创建了两个不同的变量对象。删除自包含行后,进行调试。我也看到了同样的事情。 这是密码 using (var context = new DbContext()) { var entity = context.Set<Book>() .. ...

嗨,我刚开始做一个项目。我看到了上下文查询行。它包含实体,然后再次包含。 我不明白这是什么意思。我创建了两个不同的变量对象。删除自包含行后,进行调试。我也看到了同样的事情。 这是密码

 using (var context = new DbContext())
            {
                var entity = context.Set<Book>()
                    ..
                    ...
                    .Include(x => x.Book)
                    .Include(x => x.BookAuthor).ThenInclude(x => x.Author)
                    ..
                    ... goes on
                return   entity.ToList()
                         
            }
有人能再解释一下自我包含吗。我到处都看到了
谢谢你

如果这本书有一个名为Book的导航属性,这个属性在语义上没有意义,但从技术上讲它有意义,你必须包含它才能加载它

您可以通过外键对自己进行引用,就像对任何其他表进行引用一样,并具有相应的导航属性

考虑这个例子,它在语义上更有意义:

公共阶层人士 { 公共int Id{get;set;} public int ParentId{get;set;} 公共人物父项{get;set;}//这是一个自引用导航属性 } 因此,现在要使用父对象,您必须:

persons.Includep=>p.Parent;
访问父对象。

延迟加载意味着自动加载模型类中的相关实体。 Mafii提供的父类不使用延迟加载。这就是为什么他必须使用Include方法来加载或包含父实体和相关实体。如果他没有这样做,则不会加载父导航下的任何详细信息。要自动加载相关实体,只需使用实体导航属性中的virtual关键字启用延迟加载。这样,您就不必再使用Include了


注意:我认为这会降低性能。因此,如果您这样做,您需要确保您确实需要加载这些实体。

您能在末尾发布您的实体吗?最好至少有一个实体的名称。有很多实体无法发布。我可以在书上发布另一个代码F12的示例,看看它是什么。我确定2个名称实体是桥接表。它包括到实体的桥梁。然后,在第二个示例中,包括实体到另一个网桥的网桥。只要第二行就行了。包含againcontext.Set entity book的含义是什么。。。我不知道这是什么,因为没有足够的代码来构建上下文。跟@Mafii说的差不多。这是指persons.Includep=>p.Parent.Wherep=>p.ParentId==id来获取persons Parent吗?我检查了proejct中几乎所有的实体,他们获取了virtual关键字来建立与其他实体的关系。我懒洋洋的装填对不对?但为什么它们会一次又一次地包含。虚拟意味着所有相关的数据加载,对吗?在EF core中,仅仅将一个属性设置为虚拟并不足以使延迟加载工作。我也不会将惰性加载描述为替代Include的东西。除非您是n+1查询模式的粉丝。@GertArnold好的,但如果我在启动时使用代理来配置它,它会工作吗?另外,这是否意味着如果我仍然必须使用include来访问相关实体,那么在虚拟环境中就没有意义了?这是假设我没有为延迟加载进行任何额外的配置?如果配置正确,那么是的。但我想说的是:Include用于避免延迟加载,因为在大多数情况下,这是一种有害的查询模式。问题在于解释包含,而不是提供替代方案。
using (var context = new DbContext())
                {
                    var entity = context.Set<Book>()
                        ..
                        ...
                       //remove .Include(x => x.Book)
                        .Include(x => x.BookAuthor).ThenInclude(x => x.Author)
                        ..
                        ... goes on
                    return   entity.ToList()
                             
                }
 .Include(x => x.CategoryBranches).ThenInclude(x => x.Category)
 .Include(x => x.CategoryBranches).ThenInclude(x => x.Category).ThenInclude(x => x.BookCategories);
public class Person 
{ 
  public int Id { get; set; } 
  public int ParentId { get; set; } 
  public virtual Parent Parent { get; set; }
}