Entity Framework
관련 엔티티로드 중
수색…
비고
모델이 올바르게 관련되어 있으면 EntityFramework를 사용하여 관련 데이터를 쉽게로드 할 수 있습니다. 느린 로딩 , 열렬한 로딩 및 명시 적 로딩 중에서 선택할 수있는 세 가지 옵션이 있습니다.
예제에 사용 된 모델 :
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; }
}
게으른로드
지연로드 는 기본적으로 사용됩니다. 지연로드는 파생 된 프록시 클래스를 만들고 가상 탐색 프로퍼티를 재정 의하여 수행됩니다. Lazy 로딩은 속성에 처음 액세스 할 때 발생합니다.
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.
}
특정 탐색 속성에 대해 지연로드를 해제하려면 속성 선언에서 가상 키워드를 제거하십시오.
public Person Founder { get; set; } // "virtual" keyword has been removed
Lazy 로딩을 완전히 끄려면 Context 생성자와 같이 Configuration을 변경해야합니다.
public class MyContext : DbContext
{
public MyContext(): base("Name=ConnectionString")
{
this.Configuration.LazyLoadingEnabled = false;
}
}
참고 : 직렬화를 사용하는 경우 Lazy 로딩을 꺼야합니다 . serializer는 모든 속성에 액세스하기 때문에 데이터베이스에서 모든 속성을로드합니다. 또한 탐색 속성 사이에서 루프를 실행할 수 있습니다.
열망하는 로딩
열망하는로드 는 필요한 엔티티를 즉시 로드 할 수있게합니다. 모든 엔티티가 하나의 데이터베이스 호출로 작업하도록하려면 Eager 로딩 이 필요합니다. 또한 여러 레벨을로드 할 수 있습니다.
관련 엔터티를로드하는 두 가지 옵션 이 있습니다. 강력한 형식의 메서드 또는 Include 메서드의 문자열 오버로드를 선택할 수 있습니다.
강력한 형식.
// 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();
이 메서드는 Entity Framework 4.1부터 사용할 수 있습니다. using System.Data.Entity;
하여 참조가 있는지 확인하십시오 using System.Data.Entity;
세트.
문자열 과부하.
// 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();
명시 적 로딩
Lazy로드를 해제 한 후에는 항목에 대해 Load 메소드를 명시 적으로 호출하여 엔티티를 지연로드 할 수 있습니다. Collection 은 컬렉션 을 가져 오는 데 사용되지만 참조 는 단일 탐색 속성을로드하는 데 사용됩니다.
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();
Eager 로딩 에서 위 메서드의 오버 로드 를 사용하여 entiteis를 해당 이름으로 로드 할 수 있습니다.
Company company = context.Companies.FirstOrDefault();
// Load founder
context.Entry(company).Reference("Founder").Load();
// Load addresses
context.Entry(company).Collection("Addresses").Load();
관련 엔티티를 필터링합니다.
Query 메소드를 사용하여로드 된 관련 엔티티를 필터링 할 수 있습니다.
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();
투영 검색어
관련 데이터가 비정규 화 된 형식이거나, 예를 들어 열의 하위 집합 만 필요로하는 경우 투영 쿼리를 사용할 수 있습니다. 추가 형식을 사용할 이유가 없으면 값을 익명 형식 으로 조인 할 가능성이 있습니다.
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
};
또는 쿼리 구문을 사용합니다.
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);