Sök…


Anmärkningar

Om modeller är korrekt relaterade kan du enkelt ladda relaterade data med EntityFramework. Du har tre alternativ att välja mellan: lat laddning , ivrig lastning och explicerad lastning .

Modeller som används i exempel:

public class Company
{
    public int Id { get; set; }
    public string FullName { get; set; }
    public string ShortName { get; set; }

    // Navigation properties
    public virtual Person Founder { get; set; }
    public virtual ICollection<Address> Addresses { get; set; }
}

public class Address 
{        
    public int Id { get; set; }
    public int CompanyId { get; set; }
    public int CountryId { get; set; }
    public int CityId { get; set; }
    public string Street { get; set; }

    // Navigation properties
    public virtual Company Company { get; set; }
    public virtual Country Country { get; set; }
    public virtual City City { get; set; }
}

Lat lastning

Lat laddning är aktiverad som standard. Lat laddning uppnås genom att skapa härledda proxyklasser och åsidosätta virtuella navigationsegenskaper. Lat laddning inträffar när tillgång till egendom för första gången.

int companyId = ...;
Company company = context.Companies
    .First(m => m.Id == companyId);
Person founder = company.Founder; // Founder is loaded
foreach (Address address in company.Addresses)
{
    // Address details are loaded one by one.        
}

För att stänga av Lazy-laddning för specifika navigationsegenskaper tar du bara bort virtuella nyckelord från fastighetsdeklarationen:

public Person Founder { get; set; } // "virtual" keyword has been removed

Om du vill stänga av Lazy lastning helt måste du ändra konfiguration, till exempel på Context constructor :

public class MyContext : DbContext        
{
    public MyContext(): base("Name=ConnectionString")
    {
        this.Configuration.LazyLoadingEnabled = false;
    }
}

Obs: Kom ihåg att stänga av Lazy-laddning om du använder serialisering. Eftersom serienummer får åtkomst till varje egendom du kommer att ladda alla dem från databasen. Dessutom kan du stöta på loop mellan navigationsegenskaper.

Ivrig lastning

Ivrig lastning låter dig ladda alla nödvändiga enheter på en gång. Om du föredrar att få alla dina enheter att arbeta med i ett databassamtal, är Eager-laddningen vägen att gå. Det låter dig också ladda flera nivåer.

Du har två alternativ för att ladda närstående enheter, kan du välja antingen starkt skrivit eller sträng överbelastning av Inkludera metoden.

Starkt typad.

// Load one company with founder and address details
int companyId = ...;
Company company = context.Companies
    .Include(m => m.Founder)
    .Include(m => m.Addresses)
    .SingleOrDefault(m => m.Id == companyId);

// Load 5 companies with address details, also retrieve country and city
// information of addresses
List<Company> companies = context.Companies
    .Include(m => m.Addresses.Select(a => a.Country));
    .Include(m => m.Addresses.Select(a => a.City))
    .Take(5).ToList();

Den här metoden är tillgänglig eftersom Entity Framework 4.1. Se till att du har referensen using System.Data.Entity; uppsättning.

Strängöverbelastning.

// Load one company with founder and address details
int companyId = ...;
Company company = context.Companies
    .Include("Founder")
    .Include("Addresses")
    .SingleOrDefault(m => m.Id == companyId);

// Load 5 companies with address details, also retrieve country and city
// information of addresses
List<Company> companies = context.Companies
    .Include("Addresses.Country");
    .Include("Addresses.City"))
    .Take(5).ToList();

Explicit lastning

När du har stängt av Lazy-laddningen kan du ladda enheter lätt genom att uttryckligen anropa Load- metoden för poster. Hänvisning används för att ladda enstaka navigationsegenskaper, medan Collection används för att hämta samlingar.

Company company = context.Companies.FirstOrDefault();
// Load founder
context.Entry(company).Reference(m => m.Founder).Load();
// Load addresses
context.Entry(company).Collection(m => m.Addresses).Load();

Eftersom det är på Eager-lastning kan du använda överbelastningar av ovanstående metoder för att ladda entiteis med deras namn:

Company company = context.Companies.FirstOrDefault();
// Load founder
context.Entry(company).Reference("Founder").Load();
// Load addresses
context.Entry(company).Collection("Addresses").Load();

Filtrera relaterade enheter.

Med hjälp av Query- metoden kan vi filtrera laddade relaterade enheter:

Company company = context.Companies.FirstOrDefault();
// Load addresses which are in Baku
context.Entry(company)
    .Collection(m => m.Addresses)
    .Query()
    .Where(a => a.City.Name == "Baku")
    .Load();

Projektionsfrågor

Om man behöver relaterade data i en denormaliserad typ, eller t.ex. bara en delmängd av kolumner, kan man använda projektionsfrågor. Om det inte finns någon anledning att använda en extra typ finns det möjligheten att koppla värdena till en anonym typ .

var dbContext = new MyDbContext();
var denormalizedType = from company in dbContext.Company
                       where company.Name == "MyFavoriteCompany"
                       join founder in dbContext.Founder
                       on company.FounderId equals founder.Id
                       select new 
                       {
                           CompanyName = company.Name,
                           CompanyId = company.Id,
                           FounderName = founder.Name,
                           FounderId = founder.Id
                       };

Eller med frågesyntax:

var dbContext = new MyDbContext();
var denormalizedType = dbContext.Company
                       .Join(dbContext.Founder, 
                                    c => c.FounderId,
                                    f => f.Id ,
                                    (c, f) => new 
                                    {
                                        CompanyName = c.Name,
                                        CompanyId = c.Id,
                                        FounderName = f.Name,
                                        FounderId = f.Id
                                    })
                       .Select(cf => cf);


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow