2017-05-08 2 views
1

Entity Framework 및 Fluent API가있는 SQL Server에서 관계를 만들려고합니다. 여기에 내가 삽입하는 방법은 다음과 같습니다일대 다 관계가 Entity Framework에서 null을 반환합니다.

CREATE TABLE Product (
    id INT PRIMARY KEY NOT NULL IDENTITY(1,1), 
    name VARCHAR(255) 
); 

CREATE TABLE OrderLine (
    id INT PRIMARY KEY NOT NULL IDENTITY(1,1), 
    productId INT NOT NULL, 
    FOREIGN KEY (productId) REFERENCES Product(id) 
); 

지금, product 많은 orderLine의를 가지고 있지만, 그것들을 모르는 그들을 알 필요가 없습니다. 단일 제품을 선택하고 주문 라인의 수를 계산할 필요가 없습니다. 여기 보이는 방법은 다음과 같습니다 entityframeworktutorial.net에 따르면

public class Product { 
    public int id { get; set; } 

    public string name { get; set; } 

    public ICollection<OrderLine> orderLines { get; set; } //not needed but we'll have it anyway 
} 


public class OrderLine { 
    public int id { get; set; } 

    public int productId { get; set; } 

    public Product product { get; set; } 
} 

이 작동합니다 수 :

modelBuilder.Entity<Product>() 
    .HasMany<OrderLine>(s => s.orderLines) 
    .WithRequired(s => s.product) 
    .HasForeignKey(s => s.productId); 

그러나, product 단순히 null 인 나는 밖으로 끌어하려고 할 때 데이터 베이스. 이것은 일대 다 (one-to-many) 관계가 아닌가? 나는 어디서 잘못되었는지 잘 모르겠습니다.

+0

'db.OrderLines.Include (e => e.product) .ToList();'와 같은 쿼리에 속성을 포함 시켰습니까? –

+0

@SirRufo 아니, 어떻게해야할지 모르겠다. 우리는'Order'를 가지고 있는데'Order'는'Product'를 가진'OrderLines'의 목록을 가지고 있습니다. 그래서 다음과 같이됩니다 : db.Orders.First(). orderLines.First(). product.name' 그게 합리적이라면. 첫번째 주문을 잡고 첫번째 주문을 잡고 제품을 잡고 나에게 이름을 알려주십시오. – MortenMoulder

답변

3

이것이 전체적인 문제인지 잘 모르겠지만 많은 정보가 없지만 지연로드 (시도하는 것처럼 보입니다)의 경우 탐색 속성을 가상으로 표시해야합니다. ..

public virtual Product product { get; set; } 

그렇지 않으면 EF의 프록시가이를 랩하고 처리 할 수 ​​없습니다.

+0

그건 나쁘다. 나는 이미 가상하고있다. – MortenMoulder

+0

그래, 나는 제품도 가상이어야한다는 것을 몰랐다. 나는 단지 제품에 관한 것이 었습니다. 고마워, 지금 일해라. – MortenMoulder

0

lazyloading을 활성화하지 않은 경우 EF는 기본적으로 관련 엔티티를 가져 오지 않습니다.

var product = _db.OrderLine.Include(p=>p.Product) 

다른 솔루션은 모델 빌더에 lazyloading을 활성화하지만, 복잡한 쿼리 또는 대형 테이블이 애플리케이션 성능에 큰 타격을 일으킬 수 있음을 유의하십시오 당신이 데이터를 선택할 때 당신이 필요로하는 기관을 포함 해보십시오.

관련 문제