实体框架以一对一(可选/必需)关系生成第二个左连接

时间:2012-03-21 17:42:33

标签: c# entity-framework ef-code-first entity-framework-4.2

我在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 个答案:

答案 0 :(得分:2)

首先欢迎充满惊喜的实体框架的令人兴奋的世界(!)。我以前遇到过这种情况;当您具有一对一关系时,即使您没有明确包含相关实体,实体框架也会创建一个连接语句。 在您的情况下,首先从include语句加入结果,默认情况下添加另一个左外连接。您可以通过删除include语句并观察包含左外连接语句的sql输出来检查这一点。