2012-03-21 6 views
1

나는 EF 코드 처음에 다음과 같은 모델이 다음과 같이 내가 관계를 정의엔티티 프레임 워크는 두 번째 왼쪽 일대일 (선택/필수) 관계에 참여 생성

public class A 
{ 
    public int Id { get; set; } 

    public virtual B { get; set; } 
} 

public class B 
{ 
    public int Id { get; set; } 

    public virtual A { get; set; } 
} 

을 :

나는 다음과 같은 쿼리를 작성하는 경우
modelBuilder.Entity<A>().HasKey(entity => entity.Id); 
modelBuilder.Entity<B>().HasKey(entity => entity.Id); 
modelBuilder.Entity<A>() 
    .HasOptional(entity => entity.B) 
    .WithRequired(entity => entity.A); 

:

var a = db.AItems.Include("B"); 

다음 생성되는 쿼리가 될 때 :

SELECT 
[Extent1].[Id] AS [Id], 
[Extent3].[Id] AS [Id1] 
FROM [dbo].[As] AS [Extent1] 
LEFT OUTER JOIN [dbo].[Bs] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id] 
LEFT OUTER JOIN [dbo].[Bs] AS [Extent3] ON [Extent2].[Id] = [Extent3].[Id] 

왜이 유형의 관계에 Entity Framework에는 추가 (쓸모없는) 왼쪽 결합이 있습니까?

답변

2

놀라움으로 가득한 엔티티 프레임 워크의 흥미 진진한 세계 (!)에 오신 것을 환영합니다. 나는이 상황에 직면했다. 일대일 관계가있는 경우 명시 적으로 관련 엔터티를 포함하지 않더라도 엔터티 프레임 워크는 조인 문을 만듭니다. 귀하의 경우, 먼저 include 문에서 결과를 조인하고 다른 왼쪽 외부 조인이 기본적으로 추가됩니다. include 문을 제거하고 왼쪽 외부 조인 문을 포함하는 sql 출력을 관찰하여이를 확인할 수 있습니다.

+0

이는 의미가 있습니다. 내가 포함하지 않고 왼쪽 조인을하고 있는지 궁금해 그래서 어떤 B 개체가 해당 A 레코드를 가져야하는지 확인 할 수 있는지 확인하십시오. 그 이유는 제약 조건 오류가 있기 때문입니다. – Dismissile

+0

나는 당신이 옳았다 고 생각합니다. 적어도 네비게이션 프로퍼티를 명시 적으로 포함하는 경우에는 두 번째 조인 문이 발생하지 않습니다. EF는 특히 상속과 관련된 주요 단점이 있으며 EF를 사용하려는 경우 상속 관련 문제를 읽으십시오. – daryal

+1

또한 대부분의 경우 단점보다 중요한 장점이 있습니다. – Dismissile