简体   繁体   中英

How does Find method of Entity Framework work?

I am learning Entity Framework and faced some moment with Find() method I can't understand.
Sample taken from book of Julia Lerman "Programming Entity Framework : Code First"

public class Destination
{
    public int DestinationId { get; set; }
    public string Name { get; set; }
    public string Country { get; set; }
    public string Description { get; set; }
    public byte?[]  Photo { get; set; }
    public ICollection<Lodging> Lodgings { get; set; }

    public Destination()
    {
        Lodgings = new List<Lodging>();
    }
}

public class Lodging
{
    public int LodgingId { get; set; }
    public string Name { get; set; }
    public string Owner { get; set; }
    public bool IsResort { get; set; }
    public Destination Destination { get; set; }
}

And I operate with the data in the following ways :

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

var destination = organizationDbContext.Destinations.Find(1); // case # 2
  1. Why I can't call Find() method in the first case after Include() call, but can use Where() and First()?
  2. If I use second case with Find(), here I can't call Include() method to Lodgings, so how should I load related lodgings?

My questions could be expressed in another way:

  1. What is the right way to do : find one object and load all related inner objects (one-to-many)?
  2. What is the right way to do : load all objects (set A) and inner related objects (set AI) , then find one by id from (A)?

The point is that Find starts by searching in the local cache of the context. If no match are found then it sends a query to the db.

The Find method on DbSet uses the primary key value to attempt to find an entity tracked by the context. If the entity is not found in the context then a query will be sent to the database to find the entity there. Null is returned if the entity is not found in the context or in the database.

I think it's the inner explanation that there is no Find on IQueryable. When you are using the following code EF send always a request to the db:

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

More infos : https://msdn.microsoft.com/en-us/data/jj573936.aspx

The problem is that we use different types and one of this types contains method Find while another one doesn't :

1.

var destination = organizationDbContext.Destinations // case # 1
                .Include("Lodgings") // type here is IQueryable<T> no method Find defined
                .First(p=>p.DestinationId==1); 

2.

                                     // type here is DbSet<T> with defined method Find
var destination = organizationDbContext.Destinations.Find(1); 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM