Entity Framework генерирует второе левое соединение в отношении один-к-одному (необязательно / обязательно) - PullRequest
1 голос
/ 21 марта 2012

У меня есть следующие модели в EF Code First:

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 есть дополнительное (бесполезное) левое соединение для этого типа отношений?

1 Ответ

2 голосов
/ 21 марта 2012

Сначала добро пожаловать в захватывающий мир (!) Фреймворка, полный сюрпризов.Я сталкивался с этой ситуацией раньше;когда у вас есть отношения один к одному, даже если вы явно не включаете связанную сущность, структура сущностей создает оператор соединения.В вашем случае результаты первого объединения из оператора include и другое левое внешнее соединение добавляются по умолчанию.Вы можете проверить это, удалив оператор include и наблюдая за выводом sql, который будет включать в себя левый оператор внешнего соединения.

...