C# 实体框架的Find方法是如何工作的?

C# 实体框架的Find方法是如何工作的?,c#,entity-framework,C#,Entity Framework,我正在学习实体框架,并面临着一些我无法理解的Find()方法。 示例取自Julia Lerman的书“编程实体框架:代码优先” 为什么在Include()调用之后的第一种情况下不能调用Find()方法,但可以使用Where()和first() 如果我对Find()使用第二个case,这里我不能调用Include()方法来存放,那么我应该如何加载相关的存放 我的问题可以用另一种方式表达: 正确的方法是什么:找到一个对象并加载所有相关的内部对象(一对多) 正确的方法是什么:加载所有对象(集合A)和内

我正在学习实体框架,并面临着一些我无法理解的Find()方法。
示例取自Julia Lerman的书“编程实体框架:代码优先”

  • 为什么在Include()调用之后的第一种情况下不能调用Find()方法,但可以使用Where()和first()
  • 如果我对Find()使用第二个case,这里我不能调用Include()方法来存放,那么我应该如何加载相关的存放 我的问题可以用另一种方式表达:

  • 正确的方法是什么:找到一个对象并加载所有相关的内部对象(一对多)
  • 正确的方法是什么:加载所有对象(集合A)和内部相关对象(集合A.I),然后从(A)中按id查找一个
    问题是我们使用不同的类型,其中一种类型包含方法Find,而另一种类型不包含:

    一,

    var destination=organizationDbContext.Destinations//case#1
    .Include(“lodings”)//此处的类型为IQueryable未定义方法查找
    .第一(p=>p.DestinationId==1);
    
    二,

    //这里的类型是定义了Find方法的DbSet
    var destination=organizationDbContext.Destinations.Find(1);
    
    关键是
    查找
    首先在上下文的本地缓存中进行搜索。如果未找到匹配项,则会向数据库发送查询

    DbSet上的Find方法使用主键值来尝试查找 由上下文跟踪的实体。如果在中找不到实体 然后,将向数据库发送查询以查找实体 那里如果在上下文或上下文中找不到实体,则返回Null 在数据库中

    我认为这是IQueryable上没有
    Find
    的内在解释。 使用以下代码时,EF始终向db发送请求:

    var destination = organizationDbContext.Destinations // case # 1
                    .Include("Lodgings")
                    .First(p=>p.DestinationId==1); 
    

    更多信息:

    据我所知,
    IEnumerable
    不包含方法
    Find
    ,但
    DbSet
    包含方法。这就是为什么在第二种情况下会出现这种情况
    var destination = organizationDbContext.Destinations // case # 1
                    .Include("Lodgings")
                    .First(p=>p.DestinationId==1); 
    
    var destination = organizationDbContext.Destinations.Find(1); // case # 2
    
    var destination = organizationDbContext.Destinations // case # 1
                    .Include("Lodgings") // type here is IQueryable<T> no method Find defined
                    .First(p=>p.DestinationId==1); 
    
                                         // type here is DbSet<T> with defined method Find
    var destination = organizationDbContext.Destinations.Find(1); 
    
    var destination = organizationDbContext.Destinations // case # 1
                    .Include("Lodgings")
                    .First(p=>p.DestinationId==1);