1

我在 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]

为什么实体框架对这种类型的关系有一个附加的(无用的)左连接?

4

1 回答 1

2

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

于 2012-03-21T18:33:23.747 回答